Предположим, у меня есть проект с двумя пакетами, установленными Composer:
php composer.phar require 'squizlabs/php_codesniffer:~2.0' 'phpmd/phpmd:~2.1'
Автогенерированный файл composer.json
выглядит следующим образом:
{ "require": { "squizlabs/php_codesniffer": "~2.0", "phpmd/phpmd": "~2.1" } }
В автогенерированном файле composer.lock
есть два запрошенных пакета:
2.0.0 squizlabs/php_codesniffer
2.1.3 phpmd/phpmd
а также четыре зависимости phpmd/phpmd
:
2.0.4 pdepend/pdepend
2.5.9 symfony/config
2.5.9 symfony/dependency-injection
2.5.9 symfony/filesystem
Через несколько дней squizlabs/php_codesniffer
версия squizlabs/php_codesniffer
версии 2.1.0
, но я еще не хочу запускать update
. Я хочу остаться на версии 2.0.0
, и, возможно, через несколько дней я запустил update
.
Теперь я хочу удалить phpmd/phpmd
из моего проекта. Я хочу достичь следующих целей:
phpmd/phpmd
от composer.json
phpmd/phpmd
из composer.lock
phpmd/phpmd
из папки vendor
phpmd/phpmd
от composer.lock
phpmd/phpmd
от папки vendor
squizlabs/php_codesniffer
до версии 2.1.0
Редактировать: я бы предпочел решение, которое не требует изменения ограничения версии squizlabs/php_codesniffer
в composer.json
Если я запустил:
php composer.phar remove phpmd/phpmd
это достигает точек 1, 2, 3, 6 , но не достигает точек 4, 5 .
Зависимости phpmd/phpmd
сохраняются в phpmd/phpmd
composer.lock
и папке vendor
.
Если я запустил:
php composer.phar remove phpmd/phpmd php composer.phar update
это достигает точек 1, 2, 3, 4, 5 , но не достигает точки 6 .
squizlabs/php_codesniffer
обновляется до версии 2.1.0
.
Удалите запись из composer.json
затем запустите composer update phpmd/phpmd
.
Что касается того, почему это решение работает. Я понятия не имею, но это то, что требуется, чтобы полностью удалить пакет из composer.lock
и /vendor
и позволить вам установить новый / заменяющий / конфликтующий пакет.
Сделай это:
php composer.phar remove phpmd/phpmd
Измените файл composer.json, чтобы он содержал следующий раздел require.
{ "require": { "squizlabs/php_codesniffer": "2.0.*", } }
Теперь запустите composer.phar update
. Это должно заставить вас, где вы хотите быть.
Примечание. Вы также можете привязать пакет php_codesniffer к определенной версии, например 2.0.0
. Более подробную информацию о том, как композитор выполняет управление версиями, можно найти здесь .
В настоящее время я не считаю это возможным. Это то, что вы можете пожелать передать в качестве запроса функции Composer.
Между тем, я думаю, ваш лучший выбор – пойти с вариантом №1: php composer.phar remove phpmd/phpmd
Он удалит пакет из ваших явных зависимостей, не заставляя вас ничего обновлять. Устаревшие зависимости из вашей удаленной библиотеки останутся до тех пор, пока вы не выполните следующее composer update
, которое в любом случае вы должны делать периодически. Большинство файлов из старых зависимостей должны быть настроены на автозагрузку так или иначе, поэтому у вас не должно быть никаких реальных штрафов за сохранение этих файлов, кроме места, которое они используют на диске.