Composer розв'язує обмеження версій усіх пакетів одночасно. Якщо для потрібного пакета немає версії, сумісної з рештою, він відмовляє з довгим повідомленням «Your requirements could not be resolved».
Інструменти для розслідування:
composer why vendor/package # хто залежить від пакета і з якими обмеженнями
composer why-not laravel/framework 13.0 # що заважає встановити цю версію
composer outdated --direct # які прямі залежності застаріли
composer show vendor/package --all # усі доступні версії
composer update vendor/package -W --dry-run # що оновиться разом із залежностями
why-not - найкорисніша: показує конкретний пакет і обмеження, що блокує версію. Типова відповідь: «пакет X вимагає illuminate/support ^11.0» - тобто X ще не оновився під нову версію Laravel.
Типові причини й рішення:
- Старий пакет не підтримує нову версію фреймворку чи PHP. Оновити пакет, знайти форк чи альтернативу, або відкласти оновлення.
- Залежності залежностей зафіксовані lock-файлом.
composer update vendor/packageоновлює лише його;-W(--with-all-dependencies) дозволяє оновити й залежності, які йому заважають. - Платформа: версія PHP чи розширення на машині не задовольняє
requireпакета.config.platform.phpуcomposer.jsonфіксує цільову версію PHP прод-сервера, щоб локально не поставити пакети, які там не запрацюють. - Конфлікт
conflict-обмежень: пакет явно оголосив несумісність з певними версіями іншого.
Чого не робити: --ignore-platform-reqs на проді «щоб встановилося» - пакети, що вимагають іншої версії PHP чи відсутнього розширення, впадуть під час виконання.
Профілактика: оновлювати залежності регулярно й невеликими порціями (Dependabot, Renovate), а не раз на два роки разом із мажорною версією фреймворку.