اگر برنامه نویس حرفهای PHP باشید قطعا از Composer استفاده کردهاید و میدانید که چقدر خوب میتواند وابستگیها را در پروژههای PHP مدیریت کرده و در عین حال نیز نصب پکیجهای PHP را برای ما بسیار ساده کند. اما شاید در حین استفاده از Composer مشکل کندی یا مشکلاتی دیگر را تجربه کرده باشید. در این مقاله قصد داریم نسخهی جدید Composer یعنی نسخهی 2 را بررسی کرده و با ویژگیهای جدید آن آشنا شویم، پس با ما در مقالهی تغییرات Composer 2 همراه باشید.
فهرست محتوای این مقاله
بروزرسانی به نسخهی Composer 2
برای اینکه بتوانید Composer خود را به نسخهی جدید بروزرسانی کنید (اگر Composer را به صورت global نصب کردهاید) میتوانید یکی از دستورات زیر را در Terminal خود وارد کنید تا Composer شما به نسخهی جدید بروزرسانی شود.
- میتوانید دستور composer self-update --preview را وارد کنید تا آخرین نسخهی RC را دریافت کنید.
- میتوانید دستور composer self-update --snapshot را وارد کنید تا آخرین نسخهی dev build را دریافت کنید.
- میتوانید با وارد کردن دستور composer self-update --stable به آخرین نسخهی stable یا پایدار برگردید که فعلا نسخهی پایدار، نسخهی 1 Composer است.
- شما میتوانید از دستور composer self-update --1 در CI یا اسکریپتها استفاده کنید. اگر میخواهید Composer را قبل از مهاجرت به نسخهی جدید نگه دارید، با استفاده از این دستور میتوانید در نسخهی 1.* باقی بمانید تا زمانی که نسخهی پایدار Composer 2 ارائه شود.
بهبود کارایی
در بین پروتکل Composer و وب سایت packagist (این سایت شامل تمامی پکیجهای PHP میباشد) تغییرات اساسی برای مشکل وابستگیها (Dependency) صورت گرفته است که شامل دانلود فایل موازی با استفاده از curl و بهینه سازی محدودیتها میشود. این موارد باعث شده تا بهبودهای بسیار بزرگی رخ دهد و سرعت افزایش و استفاده از رم (memory) کاهش پیدا کند. این مورد بنا بر نوع استفادهی شما ممکن است متفاوت باشد. طبق بازخوردهای گرفته شده تا الان به طور تقریبی پنجاه درصد بهبود در کار بوده است. اگر تا الان از نسخهی 2 composer استفاده نکردهاید، بسیار شگفت زده خواهید شد.
این نکته را نیز در نظر بگیرید که دستورات require و remove و یک سری از بروزرسانیهای جزئی، بسیار سریعتر از گذشته شدهاند؛ زیرا Composer در نسخهی جدید خود فقط متادیتاهای پکیجها را بارگذاری میکند.
تغییرات معماری
روش بروزرسانی وابستگیها تغییر کرده است و تنها بروزرسانیهای ضروری انجام میشوند. در حالت کنونی پوشهی vendor دیگر دخالتی در بروزرسانیها نخواهد داشت. اما به چه صورت؟ بعد از اینکه بروزرسانی یک پکیج به اتمام میرسد پروسهی نصب به صورت خودکار شروع میشود و اول از همه، تمامی شبکههای متصل (Network bound) را اجرا میکند و اگر این امکان وجود داشت به صورت موازی این کار را انجام میدهد.
امکانات runtime
در Composer 2 یک قابلیت با نام platform-check step وجود دارد، زمانی که فایل autoload.php در پوشهی vendor راهاندازی میشود، نسخه و افزونههای PHP شما بررسی میشوند و چیزهایی که مورد نیاز تمامی وابستگیها (Dependency) باشد را تطبیق میدهد؛ اگر در این پروسه نیازهای تمامی وابستگیها پیدا نشوند، این بخش ناموفق میماند.
امکان platform-check step به طور پیشفرض فعال میشود تا تمامی این وابستگیها را بخوانید و پیدا کنید. هدف از این کار این است که از شکست ناگهانی در این پروسه جلوگیری شود.
یک کلاس به اسم Composer\InstalledVersions وجود دارد که در تمامی پروژهها به طور خودکار اجرا میشود و در زمان اجرا (runtime) نیز در دسترس است که به شما این اجازه را میدهد تا هر پکیجی یا نسخههایی که وجود دارند را در زمان اجرای پروژه بررسی کنید.
اگر کد شما وابسته به امکانات runtime میباشد پس پیشنهاد میشود که دستور "composer-runtime-api": "^2.0 را حتما اجرا کنید، این پکیج یک پکیج مجازی است که خود Composer آن را تهیه کرده است تا اطمینان حاصل شود افرادی که قرار است از پکیج شما استفاده کنند، حتما Composer 2 را نصب داشته باشند.
بهبود گزارش خطاها
از آن جایی که برخی از کارها آنطور که انتظار میرود پیش نمیروند، قطعا خطاهایی به وجود میآید. Composer در نسخهی جدید خود نمایش خطاها را تا حد زیادی بهبود بخشیده است و آنها را با متن کوتاهتر به کاربر نشان میدهد تا تشخیص آسانتر باشد.
قابلیت استفاده از Compose زمانی که offline هستید
در تغییرات Composer 2 از قابلیتی رونمایی شده است که با کمک آن، حتی زمانی که اینترنت شما به مشکل خورده است و در حالت offline هستید نیز میتوانید از Composer استفاده کنید.
برای اینکه این کار عملی شود شما باید زمانی که میخواهید دستور Composer را اجرا کنید، دستور COMPOSER_DISABLE_NETWORK=1 را نیز به آن اضافه کنید یا اینکه در Environment variables خود قرار دهید، برای مثال:
COMPOSER_DISABLE_NETWORK=1 composer install
پیامی را مشاهده خواهید کرد که به شما میگوید شما در حال استفاده از Offline mode هستید (پیام زیر).
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 gabrielanhaia/laravel-circuit-breaker is not in cache and network is disabled, aborting
بروزرسانیهای کوچک و محدودیتهای موقت
برخی اوقات، بروزرسانی یک پکیج به نسخههای پایین و یا بالا مفید خواهد بود، شاید به طور موقت بخواهیم چیزی را تست کنیم یا اینکه با بروزرسانی، انتظار رفع یک باگ را داشته باشیم. برای این منظور، دستور composer update vendor/package:1.0.* را اجرا کنید (میتوانید به جای نسخهی 1.0.* هر نسخهای که خواستید برای مثال 1.0.12 را قرار دهید).
این نوع آپدیت، بخش require در فایل Composer.json را بروزرسانی نخواهد کرد و نیز فایلهای منسوخ شده در فایل Composer.lock را هدف قرار نخواهد داد.
اگر میخواهید یک محدودیت اضافه کنید یا میزان محدودیت قبلی را کاهش یا افزایش دهید و در عین حال هنوز هم تمامی وابستگیها را بروزرسانی کنید، میتوانید دستور update --with vendor/package:1.0.* را اجرا کنید تا محدودیتهای اضافه نیز بروزرسانی شوند.
سازگاری با نسخههای قبلی از بین میرود؟
موارد زیر ممکن است چندین مشکل با خود به همراه داشته باشند.
پلاگینها
به احتمال زیاد پلاگینها قرار است یک منبع بزرگ از مشکلات برای اکثر افراد باشند. زیرا پلاگینها نیاز دارند بروزرسانی شوند تا بتوانند از Composer 2 پیشتیبانی کنند و احتمالا بعضی از پلاگینها هنوز آمادگی برای بروزرسانی را نداشته باشند.
اگر پکیجها از 2 Composer پشتیبانی نکنند Composer در مسیر حل کردن مشکل وابستگیها شکست و پیروزیهایی خواهد داشت.
platform-check
امکان جدید platform-check که در بالا نیز به آن اشاره شد به این معنی است که در زمان اجرا، نسخه و اکستنشنهای در دسترس PHP شما بررسی میشود تا آنها را با وابستگیهای پروژهی شما تطابق دهد. اگر عدم تطابق پیش بیاید autoloader دچار خطا خواهد شد و اطمینان حاصل میکند که این خطا نادیده گرفته نشود. زمانی که میخواهیم پروژه را به فاز production ببریم و از مشکلات احتمالی جلوگیری کنیم، میتوانیم از دستور composer check-platform-reqs --no-dev استفاده کنیم.
اولویت Repository
اگر یک پکیج در اولویت بالاتر از ریپازیتوری وجود داشته باشد، در ریپازیتوریهایی با اولویت کمتر کاملا نادیده گرفته میشود. اگر فکر میکنید پکیج شما در Composer 2 نادیده گرفته شده است میتوانید به مستندات repository priorities docs نگاهی بندازید.
پیکربندی نامعتبر psr-0 و psr-4
پیکربندی نامعتبر psr-0 / psr-4 دیگر عمل autoload را در حالت autoload بهینه شده انجام نمیدهد. warningهایی که در Composer 1.10 نمایش داده میشدند بیشتر برای کلاسهایی بودند که نمیخواستند به صورت خودکار بارگذاری شود، این مورد صرفا برای شفاف کردن warningهایی بود که در این نسخه دریافت میشد و انتظار مشکلات بزرگی را با این مورد نداریم.
قدم بعدی چیست؟
نکتهی بسیار مهمی که وجود دارد این است که ویژگیهای Composer 2 از نسخهی PHP 5.3 به بالا پشتیبانی میشود ولی همانطور که همهی ما میدانیم این نسخه بسیار کند است و حتی کد را برای نگهداری سخت میکند. Composer 2 میخواهد که همهی کاربران آن بتوانند به جدیدترین نسخهی PHP بروزرسانی کنند و قصد دارد در نسخههای بعدی، پشتیبانی از نسخههای قدیمی PHP را از بین ببرد.
نسخهی Composer 2.1 ممکن است همچنان از نسخههای قدیمی PHP، بسته به زمانبندی و ویژگیهایی که قرار است از بین بروند نیز پشتیبانی کند اما در نسخهی Composer 2.2 قرار است نسخههای قدیمیتر از PHP 7.1.3 پشتیبانی نشوند. این عمل باعث میشود که بیش از ۹۰ درصد کاربران Composer از آخرین نسخهی PHP استفاده کنند.
جمعبندی:
در این مقاله به بررسی تغییرات Composer 2 پرداختیم. Composer در نسخهی جدید خود قدم بسیار بزرگی را برداشته است و در اولین قدمهای انتشار این نسخه توجه بسیاری از توسعه دهندگان PHP را به خودش جلب کرده زیرا به آنها کمک میکند تا کارهای مربوط به Composer را بسیار سریعتر، با امنیت بیشتر، دسترسی بهتر و... انجام دهند. اگر همچنان از نسخهی 1 Composer استفاده میکنید پیشنهاد میشود تا به نسخهی جدید بروزرسانی کنید. خوشحال میشویم در بخش نظرات تجربیات خود را از کار با نسخهی جدید و قبلی Composer با ما به اشتراک بگذارید.
اگر به یادگیری بیشتر لاراول علاقه دارید میتوانید در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنید، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژهها به صورت کامل برنامه نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.
اولین دیدگاه این پست رو تو بنویس !