Как удалить неиспользуемые зависимости из композитора?

210

Я установил пакет с помощью composer, и он установил многие другие пакеты как зависимости.

Теперь я удалил основной пакет с composer remove packageauthor/packagename, но все старые зависимости не были удалены. Я ожидал, что composer очистит и сохранит только те пакеты, которые требуются в соответствии с composer.jsonих зависимостями.

Как заставить composer очистить и удалить все неиспользуемые пакеты?

Лоренц Мейер
источник

Ответы:

377

Правильный способ сделать это:

composer remove jenssegers/mongodb --update-with-dependencies

Я должен признать, что флаг здесь не совсем очевидно относительно того, что он будет делать.

Обновить

composer remove jenssegers/mongodb

Начиная с версии 1.0.0-бета2 --update-with-dependencies это значение по умолчанию и больше не требуется.

Денис Пшенов
источник
спасибо @Yehosef за начало проблемы на github, где было предоставлено решение, но так как он не
обновил
Спасибо, я не получил конец их обсуждения.
Лоренц Мейер
3
Одно замечание: если вы уже сделали composer remove …это, но забыли, --update-with-dependenciesпока не наткнетесь на этот вопрос - последующие вызовы composer removeне убьют все зависимости. Вам нужно будет вернуться, композитор install, а затемcomposer remove --update-with-dependencies
Майк G
Теперь я получаю следующее сообщение:You are using the deprecated option "update-with-dependencies". This is now default behaviour. The --no-update-with-dependencies option can be used to remove a package without its dependencies
Pathros
4
Как насчет очистки после удаления пакета? - Вот здесь и ответ @LorenzMeyer: большие composer updateпальцы на этот ответ @LorenzMeyer
Аллен Линаток
29

На самом деле это очень просто.

composer update

сделает все это за вас, но также обновит другие пакеты.

Чтобы удалить пакет без обновления других, укажите этот пакет в команде, например:

composer update monolog/monolog

удалит monolog/monologпакет.

Тем не менее, могут остаться некоторые пустые папки или файлы, которые не могут быть удалены автоматически, и которые должны быть удалены вручную.

Лоренц Мейер
источник
8
К сожалению, это заставляет вас обновлять пакеты, а не просто удалять старые версии. Например, если у меня есть два пакета AAA / aaa ~ 1 и версия BBB / bbb ~ 2, и я в настоящее время нахожусь в версии 1.0 AAA / aaa, и они выпустили 1.1, то, когда я удаляю BBB / bbb, я автоматически обновляюсь (который может не будь то, что я собирался сделать ..)
Yehosef
Ты прав. Если у вас есть лучшее решение, вернитесь и опубликуйте его как ответ.
Лоренц Мейер
3
Пока не знаю - я просто хочу указать другим на ловушку такого подхода.
Yehosef
это действительно должен быть флаг при установке композитора .. что-то вроде--prune
Yehosef
1
если вам нравится идея, вы можете проголосовать за нее - github.com/composer/composer/issues/3751
Yehosef
20

Следующие команды будут делать то же самое отлично

rm -rf vendor

composer install 
Макс Вен
источник
2
Это, кажется, самый чистый вариант. Удалите каталог vendors и позвольте Composer получить все заново.
Мачавити
4
это
r34
composer installавтоматически удалит неиспользованные пакеты
Yidir
10

Просто запустите composer install- это заставит ваш vendorкаталог отражать зависимости в composer.lockфайле.

Другими словами - он удалит любого поставщика, который отсутствует в composer.lock.

Пожалуйста, обновите сам композитор перед запуском этого.

Valentas
источник