it-swarm.com.ru

Composer: удалить пакет, очистить зависимости, не обновлять другие пакеты

Ситуация

Допустим, у меня есть проект с двумя пакетами, установленными 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 из моего проекта. Я хочу достичь следующих пунктов:

  1. Удалить phpmd/phpmd из composer.json
  2. Удалить phpmd/phpmd из composer.lock
  3. Удалить phpmd/phpmd из папки vendor
  4. Удалить все зависимости phpmd/phpmd от composer.lock
  5. Удалите все зависимости phpmd/phpmd из папки vendor
  6. Не обновляйте squizlabs/php_codesniffer до версии 2.1.0

Edit: Я бы предпочел решение, которое не требует изменения ограничения версии 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.

38
TachyonVortex

Удалите запись из composer.json, затем запустите composer update phpmd/phpmd.

Что касается того, почему это решение, которое работает. Я понятия не имею, но это то, что требуется, чтобы полностью удалить пакет из composer.lock и /vendor и позволить вам установить новый/заменяющий/конфликтующий пакет.

33
kzap

Сделай это:

php composer.phar remove phpmd/phpmd

Измените файл composer.json так, чтобы он содержал следующий обязательный раздел.

{
    "require": {
        "squizlabs/php_codesniffer": "2.0.*",
    }
}

Теперь запустите composer.phar update. Это должно привести вас туда, где вы хотите быть.

Примечание: Вы также можете прикрепить пакет php_codesniffer к определенной версии, например 2.0.0. Дополнительную информацию о том, как composer выполняет управление версиями, можно найти в здесь .

16
Kevin G.

Я нашел этот ответ здесь ,

  1. Вручную удалите пакет из composer.json.
  2. Удалите папку поставщика вручную.
  3. Запустите composer install (из папки вашего проекта).

Composer переустанавливает пакеты, перечисленные в composer.json. 

1
JimB814

Чтобы удалить пакет из файлов .json и .lock, вы должны удалить пакет следующим образом:

composer remove package-name
1
Lauris Kuznecovs

Я не верю, что это в настоящее время возможно. Это то, что вы можете отправить как запрос функции в Composer.

Между тем, я думаю, что вам лучше всего выбрать вариант № 1: php composer.phar remove phpmd/phpmd

Он удалит пакет из ваших явных зависимостей, не заставляя вас что-либо обновлять. Устаревшие зависимости из вашей удаленной библиотеки сохранятся до следующего запуска composer update, что вам все равно следует периодически делать. Большинство файлов из старых зависимостей должны быть так или иначе настроены на автозагрузку, поэтому у вас не должно быть никаких реальных штрафов за хранение этих файлов помимо того места, которое они используют на диске.

0
Michael Cordingley