require- залежності, без яких застосунок не працює: фреймворк, бібліотеки для бізнес-логіки, SDK.require-dev- потрібні лише розробникам і CI: тестовий фреймворк (Pest, PHPUnit), статичний аналіз (PHPStan, Larastan), форматування (Pint), Faker, налагоджувальні панелі.
composer require guzzlehttp/guzzle
composer require --dev pestphp/pest
На продакшені dev-залежності не ставлять:
composer install --no-dev --optimize-autoloader
Це:
- зменшує розмір застосунку й образу;
- прибирає з сервера інструменти, яких там не має бути (менше коду - менша поверхня атаки);
- пришвидшує автозавантаження.
Типова помилка: клас з dev-пакета використовується в робочому коді. Локально все працює, бо dev-пакети встановлено, а на проді - Class not found. Приклад - фабрики й Faker у сидерах, які запускають на проді, або налагоджувальний пакет, підключений у сервіс-провайдері без перевірки оточення.
Як ловити: CI-крок, що встановлює залежності з --no-dev і запускає застосунок (або хоча б php artisan чи тести, що не потребують dev-пакетів), а також composer-require-checker для перевірки, що весь код покритий оголошеними залежностями.
Для бібліотек require-dev ще важливіший: споживачі бібліотеки отримують лише її require, тож тестові інструменти бібліотеки до них не потрапляють.