اولین نسخه Composer که مدیریت وابستگی ها (dependency manage) در زبان PHP را بر عهده دارد حدود 8 سال پیش منتشر شد. اکنون دومین نسخه اصلی آن به تازگی منتشر شده است (برای آشنایی با نسخه بندی و شماره های آن میتوانید به آموزش کامل Semantic Versioning در سایت سکان آکادمی سر بزنید). در طول این سال ها قابلیت های جدید زیادی به composer اضافه شده است تا همیشه با استاندارد های زبان PHP مطابق باشد. نسخه 2 composer در حالی که قابلیت های خوب بیشتری با خود به همراه دارد، احتمال زیاد با پروژه های کنونی شما نیز سازگار است. در این مطلب به مهم ترین تغییرات و قابلیت های نسخه 2 این dependency manager می پردازیم.
همچنین در صورتی که می خواهید با composer بیشتر آشنا شوید می توانید مقاله کامپوزر (Composer) چیست؟ و آشنایی با Composer را در سکان آکادمی مطالعه کنید.
دانلود های سریع تر
یکی از قابل توجه ترین تغییرات در این نسخه افزایش بهره وری است. پکیج ها و متا دیتای (meta data) آنها به صورت موازی دانلود خواهد شد که می تواند تا حد زیادی زمانی که برای دانلود پکیج ها صرف می شود را بهبود ببخشد.
تصویر زیر مقایسه ای بین سرعت اجرای دستور composer require laravel/laravel
در نسخه 1.10.5 و 2 است. این تست ابتدا بدون وجود cache و سپس بعد از ذخیره آن انجام شده است.
نسخه 2 بدون وجود کش دو برابر از نسخه قبل سریع تر است. این افزایش سرعت به دلیل دانلود متا دیتا و فایل های zip پکیج ها به صورت موازی است.
پشتیبانی آفلاین
شما می توانید از دسترسی نسخه 2 composer به اینترنت جلوگیری کنید. این قابلیت وقتی اینترنت شما ایراد دارد کاربردی است. در صورتی که یک فایل composer.lock
وجود داشته باشد و تمام پکیج ها به همراه متا دیتای آنها کش شده باشد، Composer 2 تلاش می کند پکیج ها را برای شما نصب کند. برای قطع دسترسی composer به اینترنت کافی است یک متغیر محیطی (environment variable) به نام COMPOSER_DISABLE_NETWORK
تعریف کرده و مقدار آن را 1 قرار دهید (برای تعریف متغیر محیطی در composer به فایل composer.json
بروید و داخل کلید config آن را تعریف کنید).
هنگامی که این متغیر مقدار دهی شد شما می توانید از دستور composer install
مثل سابق استفاده کنید. البته composer یک هشدار مبنی بر اینکه اتصال به شبکه غیر فعال است به شما نشان می دهد اما در هر صورت به کار خود ادامه می دهد.
https://repo.packagist.org could not be fully loaded (Network disabled, request canceled: https://repo.packagist.org/packages.json), package information was loaded from the local cache and may be out of date
در صورتی که پکیجی در cache موجود نباشد خطایی مانند زیر دریافت می کنید.
The required git reference for ayesh/php-timer is not in cache and network is disabled, aborting
بررسی نیازمندی های پروژه جهت اجرا شدن
در این نسخه، composer یک فایل جدید با نام platform_check.php
می سازد که پس از بارگذاری autoloader (پس از ساخته شدن فایل vendor/autoload.php
) نیازمندی های پروژه مانند نسخه PHP و افزونه های مورد نیاز را بررسی می کند. برای اطلاعات بیشتر این بخش از مستندات composer را می توانید مطاله کنید.
https://getcomposer.org/doc/07-runtime.md
اضافه شدن قابلیت Dry-run برای دستورات require و remove
دستور composer update
گزینه ی dry-run--
را دارد که باعث می شود composer به طور واقعی تغییراتی ایجاد نکند و فقط نتیجه زدن آن دستور را در terminal نشان دهد.
در این نسخه قابلیت dry-run–
به دستورات composer require
و composer remove
اضافه شده است که باعث می شود بتوانید نصب یا حذف یک پکیج را بدون تغییر دادن فایل های پروژه خود آزمایش کنید.
فرمت جدید متا دیتای مخزن ها
این نسخه، از فرمت جدیدی برای نوشتن متا دیتای مخزن ها پشتیبانی می کند. فایل های متا دیتای composer از فایل های حجیم و خرد شده ی JSON تشکیل می شدند که همیشه به چند مگابایت ترافیک برای دانلود آنها نیاز بود. فرمت جدید سبک تر است و نگهدارندگان مخزن برای هر پکیج یک آدرس اینترنتی فراهم می کنند تا composer به آن درخواست ارسال کند و آن را cache کند. معروف ترین مخزن composer که سایت Packagist.org است هم اکنون از این فرمت پشتیبانی می کند.
پشتیبانی بیشتر برای استفاده از چندین مخزن
Packagist.org مخزن پیشفرض برای composer است اما این باعث نمی شود که شما نتوانید از مخازن دیگری در پروژه خود استفاده کنید. به عنوان مثال Drupal مخزن رسمی خود را برای composer دارد. همچنین wordpress نیز یک مخزن غیر رسمی دارد. اگر شما در شرکتی مشغول به کار هستید ممکن است آنها نیز برای خودشان یک مخزن داشته باشند. هنگامی که composer به دنبال یک پکیج می گردد، از همه مخازن پیکربندی شده پرس و جو می کند و درنهایت به سراغ مخزن پیش فرض که Packagist.org است می رود. در این نسخه شما می توانید کنترل کنید که composer چگونه با چندین مخزن در یک پروژه کار کند.
تعیین اولویت برای مخزن ها
در نسخه 2، composer برای یافتن پکیج های برنامه شما به سراغ تمام مخازنی که برای آن پیکربندی کرده اید می رود. برای انجام این پیکربندی باید درون فایل composer.json
خود یک پراپرتی با نام repositories
اضافه کنید و داخل آن مخازن مورد نظر خود را به ترتیب وارد کنید. Composer در هیچ مخزن دیگری بجز مخزن هایی که شما تعیین می کنید به دنبال پکیج ها نمی گردد. همچنین اگر در یک مخزن پکیج مورد نظر پیدا شد، فرآیند جست و جو برای آن متوقف خواهد شد.
مخازن استاندارد (Canonical Repositories)
هنگامی که composer پکیجی را در یک مخزن پیدا می کند، مخازنی که اولویت کمتری از آن دارند هرگز نمی توانند برای پروژه ما آن پکیج را فراهم کنند حتی اگر نسخه جدید تری از آن را داشته باشند.
مخازن Canonical به ما کمک می کنند تا به طور تصادفی از مخازنی با اولویت کمتر، پکیجی را نصب یا بروزرسانی نکنیم. به عنوان مثال تصور کنید در پروژه خود، مخزن شخصیتان از packagist اولویت بیشتری دارد. در صورتی که ورژن جدیدی از پکیج های برنامه شما در packagist یافت شد اما در ابتدا آن پکیج از مخزن شخصی شما نصب شده بود، composer آن را از packagist بروزرسانی نمی کند. البته شما می توانید این رفتار را توسط پیکربندی ای مشابه زیر تغییر دهید.
{
...
"repositories": [
{
"type": "composer",
"url": "https://example.org",
"canonical": false
}
]
...
}
مخازن فیلتر شده
نسخه 2 composer قابلیت های only و exclude را هنگام پیکربندی مخازن، در اختیار ما قرار می دهد. این قابلیت ها به Composer می گویند که تنها برای پکیج هایی که یک الگوی خاص دارند به سراغ این مخزن برود.
{
"repositories":[
{
"type":"composer",
"url":"https://packages.drupal.org/8",
"only": ["drupal/*"]
},
{
"type":"composer",
"url":"https://wpackagist.org",
"only": ["wpackagist-plugin/*", "wpackagist-theme/*"]
}
],
}
در مثال بالا composer برای پکیج هایی که با الگوی */drupal
مطابقت دارند به سراغ مخزنی با آدرس https://packages.drupal.org/8 می رود. هنگام استفاده از گزینه ی only شما می توانید به جای الگو، نام یک یا چند پکیج خاص را بنویسید.
از گزینه ی exclude می توان برای در نظر گرفتن استثنا برای یک مخزن استفاده کرد.
هنگام استفاده از exclude نیز میتوان به جای الگو نام یک یا چند پکیج را ذکر کرد.
{
"repositories":[
{
"type":"composer",
"url":"https://example.com",
"exclude": ["example/outdated-package"]
}
],
}
در مثال بالا همه پکیج ها به جز پکیجی با نام example/outdated-package
از مخزنی با آدرس https://example.com دریافت خواهند شد.
منسوخ شدن قابلیت no-suggest–
پیش از این هنگام نصب یا بروزرسانی پکیج ها در صورتی که تمایلی به دیدن پیشنهاد هایی که composer با توجه به dependency های پروژه برای نصب می دهد نداشتید، می توانستید از قابلیت no-suggest–
استفاده کنید. اکنون هنگام استفاده از این قابلیت هشداری مانند زیر دریافت می کنید.
You are using the deprecated option "--no-suggest". It has no effect and will break in Composer 3.
بهبود روند نصب و دانلود پکیج ها
در نسخه جدید هنگام نصب یا بروزرسانی dependency ها ابتدا همه ی پکیج ها lock می شوند (فایل composer.lock
پروژه بروز می شود) سپس همه آنها دانلود و کش می شوند (در صورت امکان به صورت موازی) پس از اینکه همه فایل ها دانلود شدند یا از کش خوانده شدند composer آنها را درون پوشه vendor قرار می دهد. این روند باعث می شود تا هنگامی که اتصال به اینترنت مشکل پیدا می کند پکیج ها ناقص نصب نشوند.
قابلیت نادیده گرفتن نیازمندی های پروژه
گزینه ی ignore-platform-req–
به دستورات composer install
و composer update
اضافه شده است تا در صورتی که می خواهید، یک یا چند نیازمندی پروژه مثل نسخه PHP را هنگام نصب و بروزرسانی نادیده بگیرید.
composer install --ignore-platform-req php
درمثال بالا هنگام نصب پکیج ها، نسخه PHP را نادیده گرفتیم.
همچنین گزینه ی ignore-platform-reqs--
هم وجود دارد که همه ی نیازمندی ها را نادیده می گیرد.
autoload نشدن کلاس هایی که از استاندارد psr-4 و psr-0 پیروی نمی کنند
اگر با نسخه های پیشین composer پکیجی را نصب کرده باشید حتما این هشدار را دیده اید که از نسخه 2 به بعد کلاس هایی که namespace آن ها با استاندارد psr-4 و psr-0 مطابقت ندارند دیگر autoload نخواهند شد. شما می توانید این استاندارد ها را در سایت مرجع مشاهده کنید.
در این مطلب سعی شد برجسته ترین ویژگی های نسخه 2 composer را مطرح کنیم. شما همین الان می توانید با زدن دستور composer self-update
این بروزرسانی را در سیستم خود انجام دهید.