Como remover dependências não utilizadas do compositor?

210

Eu instalei um pacote com o compositor e ele instalou muitos outros pacotes como dependências.

Agora eu desinstalei o pacote principal com composer remove packageauthor/packagename, mas todas as dependências antigas não foram removidas. Eu esperava que o compositor limpasse e mantivesse apenas os pacotes necessários de acordo com composer.jsone suas dependências.

Como forçar o compositor a limpar e remover todos os pacotes não utilizados?

Lorenz Meyer
fonte

Respostas:

376

A maneira correta de fazer isso é:

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

Devo admitir que a bandeira aqui não é tão óbvia quanto ao que ela fará.

Atualizar

composer remove jenssegers/mongodb

A partir da v1.0.0-beta2 --update-with-dependencies é o padrão e não é mais necessário.

Denis Pshenov
fonte
graças a @Yehosef para iniciar a questão no github, onde a solução foi fornecido, mas desde que ele não atualizar sua resposta eu decidi escrever meu próprio para everyones conveniência
Denis Pshenov
Obrigado, eu não terminei a discussão deles.
Lorenz Meyer
3
Uma coisa a ser observada: se você já tinha composer remove …, mas esqueceu --update-with-dependenciesaté encontrar essa pergunta - chamadas subseqüentes para composer removenão matam todas as dependências. Você precisará reverter, compositor e install, em seguida,composer remove --update-with-dependencies
Mike G
Agora recebo a seguinte mensagem: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
Que tal limpeza após a remoção de um pacote? - É aí que @LorenzMeyer resposta vai em: composer updatePolegares até este resposta a @LorenzMeyer
Allen Linatoc
29

De fato, é muito fácil.

composer update

fará tudo isso por você, mas também atualizará os outros pacotes.

Para remover um pacote sem atualizar os outros, especifique esse pacote no comando, por exemplo:

composer update monolog/monolog

irá remover o monolog/monologpacote.

No entanto, pode haver algumas pastas ou arquivos vazios que não podem ser removidos automaticamente e que precisam ser removidos manualmente.

Lorenz Meyer
fonte
8
a parte infeliz disso é que ele obriga a atualizar seus pacotes em vez de apenas remover as versões antigas. Por exemplo, se eu tenho dois pacotes AAA / aaa ~ 1 e versão BBB / bbb ~ 2 e atualmente estou na versão 1.0 do AAA / aaa e eles lançaram 1.1, então quando eu excluo BBB / bbb eu sou atualizado automaticamente (o que pode não acontecer) ser o que eu tinha a intenção de fazer ..)
Yehosef
Você está certo. Se você tiver uma solução melhor, volte e poste-a como resposta.
Lorenz Meyer
3
Ainda não - só quero apontar para os outros uma armadilha dessa abordagem.
Yehosef 16/02
ele realmente deve ser uma bandeira sobre o compositor instalar .. algo como--prune
Yehosef
1
se você gosta da idéia, pode votar nela - github.com/composer/composer/issues/3751
Yehosef 16/02/15
20

Os seguintes comandos farão o mesmo perfeitamente

rm -rf vendor

composer install 
Max Wen
fonte
2
Esta parece ser a opção mais limpa. Exclua o diretório de fornecedores e deixe o Composer recuperar tudo.
21818 Machavity
4
este é o estilo npm "save my day";)
r34
composer installexcluirá automaticamente pacotes não utilizados
Yidir
10

Basta executar composer install- ele fará com que seu vendordiretório reflita as dependências no composer.lockarquivo.

Em outras palavras - ele excluirá qualquer fornecedor ausente composer.lock.

Atualize o próprio compositor antes de executar isso.

Valentas
fonte