زمانی که اقدام به توسعهٔ نرمافزار میکنیم، فارغ از اینکه از چه فریمورک یا زبان برنامهنویسی برای کدنویسی استفاده مینماییم، گاهی اوقات نیاز به استفاده از پکیجها و لایبرریهای سایر برنامهنویسان داریم که به صورت اپنسورس عرضه شدهاند تا بتوانیم به جای آنکه خود اقدام به نوشتن مثلاً کلاس خاصی کنیم، از کدهایی که قبلاً توسط سایر دولوپرها نوشته شده و آزمایش خود را پس دادهاند استفاده نماییم و Composer هم ابزاری است که فرایند Dependency Management (مدیریت وابستگی) را برای دولوپرهای زبان برنامهنویسی PHP تسهیل میکند.
Composer در ابتدای ماه مارس سال ۲۰۱۲ به صورت رایگان توسط Nils Adermann و Jordi Boggiano با الهام از NPM و Bundler توسعه داده شد و تاکنون استقبال بسیار خوبی از این ابزار از طرف برنامهنویسان زبان برنامهنویسی PHP صورت گرفته است. به طور خلاصه، کامپوزر یک ابزار کامندلاین است که در آن با استفاده از یکسری دستورات از پیش تعریف شده میتوان به مدیریت منابع خارجی پرداخت.
حال ممکن است این پرسش پیش بیاید که کامپوزر پکیجهای مورد نیاز را از کجا دانلود میکند. در پاسخ به این پرسش، باید گفت که منبع اصلی که کامپوزر از آن استفاده میکند سایت Packagist است که به عنوان ریپازیتوری پیشفرض پروژههای پیاچپی میباشد که دولوپرهای فریمورکها و لایبرریهای مختلف پروژههای خود را در آن آپلود کرده و از آن پس با استفاده از کامپوزر میتوان به کلیهٔ پکیجهای قرار گرفته روی این سایت دسترسی داشت.
آشنایی با روشهای نصب کامپوزر روی سیستمعاملهای مختلف
کامپوزر را میتوان هم روی سیستمعامل ویندوز و هم روی سیستمعاملهایی که بر پایهٔ یونیکس هستند، مثل مکینتاش و گنو/لینوکس، نصب کرد. به طور کلی، دو روش مختلف برای نصب و استفاده از کامپوزر داریم که تحت عناوین Locally و Globally شناخته میشوند (نکتهای که در ارتباط با کامپوزر باید مد نظر داشته باشیم این است که این ابزار بر خلاف ابزارهایی همچون apt لینوکس، هرگز چیزی را به صورت سراسری نصب نمیکند بلکه پروژه-محور کار میکند.)
نصب کامپوزر به صورت Locally
وقتی که کامپوزر را به صورت لوکال نصب کنیم، این ابزار پروژه-محور خواهد بود. به عبارت دیگر، صرفاً برای یک پروژهٔ خاص از این ابزار میتوان استفاده کرد که به صورت یک فایل PHAR است که برای اجرای آن هم باید از دستور php composer.phar
استفاده کرد (PHAR مخفف واژگان PHP Archive است که به منزلهٔ یک فرمت آرشیو برای زبان PHP است.) به طور کلی، این روش خیلی توصیه نمیشود چرا که دولوپر را محدود به یک پروژهٔ خاص میکند.
نصب کامپوزر به صورت Globally
در این روش، ما میتوانیم فایل composer.phar
را در هر جایی روی سیستم خود قرار داده و چنانچه این مکان جزئی از PATH سیستمعامل باشد، به صورت سراسری و از داخل هر پروژهای میتوانیم به این ابزار دسترسی پیدا کنیم. نیاز به توضیح است که در سیستمعاملهای مبتنی بر یونیکس مثل مک یا لینوکس، میتوان فایل را قابلاجرا کرده تا در حین استفاده دیگر نیازی به تایپ کردن دستور php
هم نداشته باشیم و این مسئله سرعت کار با کامپوزر را به مراتب افزایش خواهد داد.
نصب کامپوزر روی سیستمعامل گنو/لینوکس توزیع اوبونتو بسیار ساده است و صرفاً با کامند زیر میتوان این ابزار را روی سیستمعامل خود نصب کرد:
$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
همانطور که در کامند فوق مشخص است، با استفاده از ابزار curl
فایل اینستالر کامپوزر را از سایت رسمی این ابزار دانلود کرده سپس آن را در مسیر usr/locl/bin/
قرار میدهیم و نامی هم که برایش در نظر میگیریم composer
خواهد بود. حال برای اینکه از صحت نصب اطمینان حاصل کنیم، دستور composer
را در ترمینال وارد میکنیم:
$ composer
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 1.4.2 2017-05-17 08:17:52
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
--profile Display timing and memory usage information
--no-plugins Whether to disable plugins.
-d, --working-dir=WORKING-DIR If specified, use the given directory as working directory.
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Available commands:
about Short information about Composer.
archive Create an archive of this composer package.
browse Opens the package's repository URL or homepage in your browser.
clear-cache Clears composer's internal package cache.
clearcache Clears composer's internal package cache.
config Set config options.
create-project Create new project from a package into given directory.
depends Shows which packages cause the given package to be installed.
diagnose Diagnoses the system to identify common errors.
dump-autoload Dumps the autoloader.
dumpautoload Dumps the autoloader.
exec Execute a vendored binary/script.
global Allows running commands in the global composer dir ($COMPOSER_HOME).
help Displays help for a command
home Opens the package's repository URL or homepage in your browser.
info Show information about packages.
init Creates a basic composer.json file in current directory.
install Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
licenses Show information about licenses of dependencies.
list Lists commands
outdated Shows a list of installed packages that have updates available, including their latest version.
prohibits Shows which packages prevent the given package from being installed.
remove Removes a package from the require or require-dev.
require Adds required packages to your composer.json and installs them.
run-script Run the scripts defined in composer.json.
search Search for packages.
self-update Updates composer.phar to the latest version.
selfupdate Updates composer.phar to the latest version.
show Show information about packages.
status Show a list of locally modified packages.
suggests Show package suggestions.
update Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.
validate Validates a composer.json and composer.lock.
why Shows which packages cause the given package to be installed.
why-not Shows which packages prevent the given package from being installed.
میبینیم که این ابزار به درستی روی سیستم نصب شده است (لازم به ذکر است که پیش از نصب کامپوزر، از نصب PHP و ابزار cURL روی سیستم باید اطمینان حاصل کرد.)
نصب کامپوزر روی ویندوز
سادهترین راه برای نصب این ابزار روی سیستمعامل ویندوز، استفاده از اینستالر کامپوزر برای ویندوز است. با دانلود Composer-Setup.exe، این اینستالر آخرین ورژن کامپوزر را روی سیستمعامل شما نصب کرده و PATH را نیز تنظیم میکند و از آن پس به سادگی قادر خواهید بود تا با اجرای کامند composer
از داخل هر فولدری، به استفاده از این ابزار بپردازید.
آشنایی با نحوهٔ کار با کامپوزر
زمانی که میخواهید از این ابزار استفاده کنید، صرفاً نیاز به فایلی تحت عنوان composer.json
خواهید داشت که دیپندنسیهای پروژهٔ شما به علاوهٔ یکسری دیتای دیگر را شامل میگردد و اسکریپت داخل این فایل چیزی شبیه چیزی است که در ادامه ملاحظه مینمایید:
{
"require": {
"monolog/monolog": "1.0.*"
}
}
در مثال فوق، قصد داریم لایبرری monolog
که برای لاگگیری پروژه استفاده میشود را نصب کنیم. همانطور که در کد فوق ملاحظه میشود، نیازمندیهای پروژه در کلیدی تحت عنوان require
آمده است. به عبارت دیگر، با مقادیری که ذیل require
قرار میدهیم، به کامپوزر نشان میدهیم که پروژهٔ ما مبتنی بر چه وابستگیها، لایبرریها و حتی دیگر پروژهها است.
در کلید require
هم باید هر وابستگی را در خط مجزایی به صورت Key-Value بنویسیم. به طور مثال، در کد فوق گفتهایم که به لایبرری monolog/monolog
نسخهٔ *.1.0 نیاز خواهیم داشت. از این پس، کامپوزر با استفاده از این دادهها به جستجو در ریپازیتوریهایی که مشخص کرده باشید خواهد پرداخت (همانطور که در کد فوق ملاحظه میشود، هیچگونه کلیدی مرتبط با repositories
درج نشده است و در چنین شرایطی کامپوزر به صورت پیشفرض از سایت Packagist که پیش از این معرفی شد به عنوان ریپازیتوری دیفالت استفاده خواهد کرد. به عبارت دیگر، در مثال فوق کامپوزر فرض را بر این میگذارد که پروژهٔ monolog/monolog
در سایت Packagist قبلاً ثبت شده است.)
آشنایی با Package Name در کامپوزر
به طور کلی، نام پکیجها از دو بخش تشکیل شده است که بخش اول مرتبط با نام شرکت یا دولوپر سازندهٔ آن است و بخش دوم هم نام خود پکیج است. در مثال فوق، از آنجا که هم نام شرکت توسعهدهنده و هم نام خود پکیج یکسان است، از ساختار monolog/monolog
استفاده شده است (نیاز به توضیح است که معمولاً هر دو نام یکی است و نام توسعهدهنده صرفاً به این خاطر ذکر میشود که با دیگر پکیجها تداخل به وجود نیاید. در واقع، این ساختار نامگذاری اجازه میدهد که دو شرکت یا دولوپر مختلف اقدام ساخت پکیجهایی با نام یکسان کنند. به عنوان مثال، دو دولوپر به نامهای behzad و sahand میتوانند پکیجی تحت عنوان todo
طراحی کنند و این در حالی است که به ترتیب با نام کامل behzad/todo
و sahand/todo
به رسمیت شناخته خواهند شد و هرگز هم با یکدیگر تداخل نخواهند کرد.)
آشنایی با Package Version در کامپوزر
در مثال فوق، قصد داریم پکیجی تحت عنوان monolog/monolog
با نسخهٔ *.1.0 را به پروژهٔ خود اضافه کنیم. در واقع، *.1.0 بدان معنا است که ما نیاز داریم تا نسخهای از این لایبرری که میتواند چیزی مابین 1.0.0 تا 1.0.9 و کوچکتر از 1.1 باشد را دانلود کنیم.
فرایند نصب پکیج با استفاده از کامپوزر
به منظور نصب پکیجهایی که در فایل composer.json
مشخص ساختهایم، باید ابتدا از طریق کامندلاین وارد پوشهٔ پروژهٔ مد نظر شده سپس از دستور install
استفاده نماییم:
$ composer install
فرض کنیم فولدر پروژهٔ مد نظر project
نام دارد و داخل آن هم فایل composer.json
با محتویاتی قرار دادهایم که در بالا بدان اشاره شد. از طریق کامندلاین وارد مسیر این فولدر شده سپس دستور فوق را اجرا میکنیم که در این صورت چند اتفاق رخ خواهد داد. همانطور که در ادامه میبینیم، داخل پوشهٔ project
دایرکتوری و فایلهای زیر افزوده میشود:
vendor
composer.json
composer.lock
داخل پوشهٔ vendor
هم خواهیم داشت:
composer
monolog
autoload.php
اگر این اولین باری است که کامند install
را اجرا میکنیم، کامپوزر تمامی وابستگیهایی که در فایل composer.json
لیست شدهاند را دانلود کرده و داخل پوشهای تحت عنوان vendor
میریزد که نام پوشهٔ پیشفرض لایبرریهای به اصطلاح Third-party است مضاف بر اینکه اگر خود لایبرری monolog/monolog
به وابستگیهای دیگری برای اجرا نیاز داشته باشد، آنها هم در این پوشه نصب خواهند شد.
به خاطر داشته باشیم که اگر از سیستمهای ورژن کنترلی همچون Git استفاده میکنیم، باید مسیر پوشهٔ vendor
را داخل فایلی تحت عنوان gitignore.
بیفزاییم چرا که افزودن فایلهای لایبرریهای قرار گرفته در این پوشه به ریپازیتوری گیت اصلاً ضرورتی نداشته و صرفاً فضا را اشغال میکنند و هر دولوپر دیگری که بخواهد روی پروژهٔ ما کار کند، به سادگی قادر خواهد بود تا سورسکدهای اختصاصی ما را از سیستم ورژن کنترل دریافت کرده و سپس با استفاده از کامپوزر، وابستگیهای مورد نیاز را دانلود کند و پروژه را تکمیل سازد.
پس از اتمام فرایند دانلود وابستگیها، کاپوزر فایلی تحت عنوان composer.lock
را داخل ریشهٔ پروژه ایجاد کرده و کلیهٔ دادههای مرتبط با تمامی پکیجها و نسخهٔ دقیق آنها را داخل این فایل ثبت میکند. به عبارت دیگر، پروژه روی دقیقاً وابستگیهای ثبتی توسط دولوپر قفل میگردد و به نوعی پروژه فقط و فقط با آن وابستگیها کار خواهد کرد. در واقع، اگر گروهی از دولوپرهای PHP روی پروژهای یکسان کار کنند، دولوپر اصلی پروژه باید فایل composer.lock
را روی سیستم کنترل نسخهای همچون Git بفرستند تا دیگر دولوپرها را ملزم کند تا دقیقاً با دیپندنسیهای مد نظرش پروژه را اجرا کنند.
به خاطر داشته باشیم که اگر از یک بار کامند install
را اجرا کرده باشیم و یا از قبل فایل composer.lock
در پروژهٔ ما وجود داشته باشد، وقتی که کامند install
را اجرا میکنیم، کامپوزر تمامی وابستگیهایی که داخل فایل composer.json
هستند را نصب میکند اما در عین حال دقیقاً نسخههایی که در فایل composer.lock
قبلاً به ثبت رسیدهاند را نصب خواهد کرد تا این اطمینان حاصل گردد که تمامی اعضای تیم توسعهٔ نرمافزار با نسخهای یکسان از پکیجها کار میکنند و اگر در ماههای آتی نسخههای جدید از پکیجها عرضه گردد که به نوعی سازگار با پروژهٔ شما نباشند، مطمئن خواهید بود که تحت هیچ عنوان پروژه به مشکل نخواهد خورد.
آپدیت کردن وابستگیهای پروژه از طریق کامپوزر
همانطور که پیش از این توضیح داده شد، فایل composer.lock
منجر به این خواهد گشت تا نسخههای جدید پکیجها به صورت خودکار نصب نشوند اما اگر شخصاً بخواهیم اقدام به نصب آخرین نسخه از وابستگیهای پروژه کنیم، نیاز است تا با دستور آپدیت آشنا شویم:
$ composer update
کامند فوق آخرین نسخه از پکیجهای مورد نیاز پروژه که سازگار با نسخههای درج شده در فایل composer.json
باشند را از ریپازیتوریهای مربوطه دریافت کرده و نصب میکند مضاف بر اینکه فایل composer.lock
را هم آپدیت کرده و نسخههای جدید دانلودی را داخل آن درج میکند. به یاد داشته باشیم که کامند فوق کلیهٔ وابستگیهای یک پروژه را آپدیت میکند و این در حالی است که اگر بخواهیم صرفاً یک پکیج به خصوص را آپدیت کنیم، حتماً باید نام پکیج یا لایبرری را به عنوان آپشن کامند فوق در نظر بگیریم:
$ composer update monolog/monolog
همانطور که در کامند فوق ملاحظه میشود، از این طریق دستور دادهایم که فقط و فقط پکیجی تحت عنوان monolog/monolog
آپدیت شده و سایر پکیجهای داخل پوشهٔ vendor
، البته در صورتی که پکیج دیگری وجود داشته باشد، دستنخوره باقی بمانند.
آشنایی با مفهوم Autoloading
برای لایبرریهایی همچون monolog
، همانطور که در بالا مشاهده شد، کامپوزر در داخل پوشهٔ vendor
فایلی تحت عنوان autoload.php
ایجاد میکند و این در حالی است که به سادگی قادر خواهیم بود تا این فایل را هر کجا که تمایل به استفاده داشتیم اصطلاحاً require
کرده و از آن پس از کلیهٔ کلاسهای این لایببری در سایر فایلها استفاده نماییم:
require __DIR__ . '/vendor/autoload.php';
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');
به طور کلی، کامپوزر ابزاری است که دولوپرهای حرفهای PHP باید به آن مسلط باشند چرا که پس از آشنایی با نحوهٔ مدیریت وابستگیهای یک پروژه با این ابزار، سرعت کار ایشان به مراتب بالاتر خواهد رفت.