Новая команда composer bump в Composer 2.4
Composer версии 2.4 добавляет новую команду bump
На текущий момент версия композера 2.3.9. Скоро в релиз выйдет версия 2.4. И в этот релиз добавят интересную команду с названием bump, которая увеличивает требования к номерам версии пакетов, перечисленные в composer.json. Когда номера версий в файле composer.json будут изменены, Composer уже не может установить более раннюю версию необходимых пакетов.
Например, файл composer.json, для которого требуется пакет phpunit/phpunit с ограничением версии, ^9.4.0 означает, что Composer разрешено устанавливать версии пакета phpunit/phpunit в диапазоне от >= 9.4.0 и до < 10.
{
"require-dev": {
"phpunit/phpunit": "^9.4"
}
}
Когда выполнится команда composer bump, она обновляет требования всех пакетов ( если они не сужены) до текущей установленной версии, делая текущую версию нижней границей ограничения пакета.
В примере phpunit/phpunit текущая установленная версия — 9.5.20, запуск composer bump обновит файл composer.json, чтобы использовать эту версию в качестве нижней границы:
{
"require": {
- "phpunit/phpunit": "^9.4"
+ "phpunit/phpunit": "^9.5.20"
}
}
Стоит заметить, что команда composer bump не обновляет требования к платформе, такие как версия PHP и версий расширения.
Сужение списка пакетов
Команда composer bump поддерживает сужение пакетов, которые передаются в разделы require и require-dev с необязательными флагами.
- --dev-only: только пакеты в require-dev.
- --no-dev-only: пакеты в require.
Например, следующая команда поднимает требования только тем пакетам, которые перечислены в разделе require-dev файла composer.json:
composer bump --dev-only
Требование файла composer.lock
Команде composer bump требуется обновленный файл composer.lock. Это связано с тем, что composer bump проверяет файл composer.lock, чтобы определить текущие установленные версии.
Если файла composer.lock не существует, Composer выдает сообщение об успешном выполнении:
No requirements to update in ./composer.json.
Если файл composer.lock устарел, Composer завершает работу с ошибкой:
The lock file is not up to date with the latest changes in composer.json. Run the appropriate `update` to fix that before you use the `bump` command.
Предупреждение при превышении требований
Обратите внимание, что при изменении ограничений версии он эффективно сужает список возможных версий, которые Composer может разрешить. Когда пакет требуется для нескольких непосредственных или косвенных зависимостей, сужение ограничений версии может помешать Composer правильно определить номер версии.
Когда библиотекам требуется один и тот же пакет, но с разными ограничениями версии, изменение нижней границы одной библиотеки может помешать ее использованию вместе с другой библиотекой.
Например, Composer может установить библиотеку symfony/finder, если две библиотеки требуют ее с ограничениями версии, такими как ^6.0.0 (любая 6.* версия) и ~6.0.0 (любая 6.0.* версия), выбрав версию symfony/finder, которая удовлетворяет обоим ограничениям версии, например 6.0.8.
Если пакет A решит увеличить ограничение symfony/finder версии до ^6.1.0, Composer больше не сможет правильно определить версию, потому что пакет B поддерживает только последовательные версии symfony/finder 6.0.
Композер сразу предупреждает и об этом:
Warning: Bumping dependency constraints is not recommended for libraries as it will narrow down your dependencies and may cause problems for your users.
If your package is not a library, you can explicitly specify the "type" by using "composer config type project".
Alternatively you can use --dev-only to only bump dependencies within "require-dev".
Как говорится в предупреждении, рекомендуется обновлять раздел require-dev только с опцией --dev-only, чтобы предотвратить чрезмерное сужение вариантов версий зависимостей.
Что думаешь?