Композитор: удалите пакет, очистите зависимости, не обновляйте другие пакеты
Ситуация
Скажем, у меня есть проект с двумя пакетами, установленными 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
версия 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
остаются в папке 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
.
Ответы
Ответ 1
Удалите запись из composer.json
, затем запустите composer update phpmd/phpmd
.
Что касается решения, которое работает. Я понятия не имею, но это то, что требуется для полного удаления пакета из composer.lock
и /vendor
, и вы можете установить новый/заменяющий/конфликтующий пакет.
Ответ 2
Сделайте это:
php composer.phar remove phpmd/phpmd
Измените файл composer.json, чтобы он содержал следующий раздел require.
{
"require": {
"squizlabs/php_codesniffer": "2.0.*",
}
}
Теперь запустите composer.phar update
. Это должно сделать вас там, где вы хотите быть.
Примечание.. Вы также можете привязать пакет php_codesniffer к определенной версии, например. 2.0.0
. Более подробную информацию о том, как композитор выполняет управление версиями, можно найти на здесь.
Ответ 3
Я не считаю, что в настоящее время это возможно. Это то, что вы можете пожелать отправить как запрос функции в Composer.
Между тем, я думаю, ваш лучший выбор - пойти с опцией №1: php composer.phar remove phpmd/phpmd
Он удалит пакет из ваших явных зависимостей, не заставляя вас ничего обновлять. Устаревшие зависимости из вашей удаленной библиотеки останутся до следующего запуска composer update
, и это то, что вы должны делать периодически в любом случае. Большинство файлов из старых зависимостей должны быть настроены на автозагрузку так или иначе, поэтому у вас не должно быть никаких реальных штрафов за сохранение этих файлов, кроме места, которое они используют на диске.