Подтвердить что ты не робот

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

Ситуация

Скажем, у меня есть проект с двумя пакетами, установленными 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.

4b9b3361

Ответ 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, и это то, что вы должны делать периодически в любом случае. Большинство файлов из старых зависимостей должны быть настроены на автозагрузку так или иначе, поэтому у вас не должно быть никаких реальных штрафов за сохранение этих файлов, кроме места, которое они используют на диске.