Composer 2.11 با سیاست cooldown برای پکیجهای تازه
خلاصهٔ کاملتر
Composer 2.11.0 یه dependency policy جدید به اسم cooldown اضافه کرده. یعنی یه مدت انتظار، مثلاً یه روز، تعیین میکنی و Composer هر نسخهای از پکیج که کمتر از این مدت ازش گذشته رو نادیده میگیره. فرضش کن یکی یه نسخهٔ مخرب از پکیجی که بهش وابستهای منتشر کنه؛ اگه تو همون یه روز گزارش و حذف بشه، پروژهت اصلاً نصبش نمیکنه. نسخهٔ 2.10 هم قبلاً سیاستهایی برای بلاک کردن نسخههای دارای security advisory یا malware آورده بود.
این سیاست تا وقتی period رو زیر config.policy تنظیم نکنی خاموشه:
{
"config": {
"policy": {
"cooldown": {
"period": "1 day"
}
}
}
}مقدار period میتونه رشتهای مثل "6 hours" یا "7 days" باشه یا یه عدد به ثانیه. cooldown موقع composer update و composer require اعمال میشه، ولی روی composer install اثری نداره چون اون دقیقاً همون چیزی که تو composer.lock هست رو نصب میکنه. نسخههای dev مثل dev-main و پکیجهای پلتفرم (PHP و extensionها) هیچوقت نگه داشته نمیشن. یه composer update کامل اگه نسخهٔ قفلشدهای هنوز تو دورهٔ cooldown باشه، اونو با نسخهٔ قدیمیتر عوض میکنه و اگه نسخهٔ قدیمیتری با constraintها جور نباشه، آپدیت شکست میخوره.
برای پکیجهایی که بهشون اعتماد داری میتونی یه لیست ignore بذاری که wildcard هم قبول میکنه، مثل mycompany/*. اگه فوری یه patch امنیتی لازم داری، فلگ --no-cooldown فقط همین سیاست رو دور میزنه و بقیهٔ سیاستها سر جاشون هستن. تو CI هم متغیر COMPOSER_POLICY_COOLDOWN_PERIOD کار میکنه و مقدار 0 خاموشش میکنه.
چرا 2.10 این قابلیت رو نداشت؟ چون تنها زمان موجود تو metadata فیلد time بود که دست خود نویسندهٔ پکیجه. حالا Packagist.org برای هر نسخه یه published-time گزارش میده، یعنی زمانی که خود Packagist اون نسخه رو در دسترس گذاشته. اگه یه repository دیگه این فیلد رو نده، دستور شکست میخوره؛ برای repoهای مطمئن میشه require-published-time رو false کرد. به گفتهٔ مقاله، کسایی که از پلاگین Heimdall برای همین کار استفاده میکردن دیگه بهش نیازی ندارن.
این نسخه شش رفع امنیتی هم داره؛ مثلاً Composer دیگه موقع install فایلی بیرون از پوشهٔ vendor نمینویسه، headerهای HTTP مثل API token دیگه تو composer.lock ذخیره نمیشن، و گواهیهای میانی eMudhra رد میشن. سیاستهای سفارشی هم حالا گزینهٔ block-scope دارن که با مقدار install یا all جلوی composer install رو هم میگیره، پس یه نسخهٔ مشکوک تو lock file باعث شکست deploy میشه.
یه تغییر مهم دیگه: اگه دانلود dist (فایل zip نسخه) شکست بخوره، Composer دیگه خودش سراغ clone کردن سورس نمیره و گزینهٔ source-fallback هم حذف شده. اگه پکیجی فقط از سورس درست نصب میشه، از preferred-install یا --prefer-source استفاده کن. حل وابستگیها هم سریعتر و کممصرفتر شده؛ تو یه اندازهگیری روی laravel/laravel زمان CPU از 1.50 به 1.18 ثانیه رسیده.
نکات کلیدی:
- cooldown با config.policy.cooldown.period فعال میشه و پیشفرض خاموشه
- روی composer install اثری نداره، فقط روی update و require
- --no-cooldown فقط cooldown رو دور میزنه، نه سیاستهای advisory و malware
- Packagist.org حالا برای هر نسخه published-time گزارش میده
- fallback به نصب از سورس حذف شده و source-fallback دیگه وجود نداره
- تغییر در policy باعث میشه lock file قدیمی حساب بشه و هشدار بده




