Como forçar o composer a reinstalar uma biblioteca?

96

Estou usando o aplicativo de esqueleto ZF2 e ele tem um .gitignore que impede que bibliotecas externas sejam enviadas para o git. Durante a depuração, gosto de mudar algumas coisas aqui e ali no código-fonte das bibliotecas para aprender como as coisas funcionam. Se estes fossem controlados por versão, seria muito fácil revertê-los de volta ao seu estado original.

Como posso forçar o Composer a reinstalar uma estrutura específica para que eu possa obter uma cópia -não modificada- novamente?

PS: Não sugira remover o arquivo .gitignore, pois ele está lá por um motivo; ele impede que minhas bibliotecas de terceiros entrem no repositório do meu aplicativo. Sempre posso instalá-los durante uma implantação automatizada.

Julian
fonte
2
Uma opção seria excluir composer.lock e executar composer install
vascowhite

Respostas:

48

Você pode usar o --prefer-sourcesinalizador do composer para fazer check-out de pacotes externos com as informações VCS (se houver alguma disponível). Você pode simplesmente voltar ao estado original. Além disso, se você emitir o composer updatecomando composer irá detectar todas as mudanças feitas localmente e perguntar se você deseja descartá-las.

Seu arquivo .gitignore está relacionado ao seu projeto raiz (esqueleto ZF2) e evita que o diretório do fornecedor (onde estão as bibliotecas de terceiros) se comprometa com seu próprio VCS. O arquivo ignore não está relacionado ao repositório git de seus fornecedores.

Bram Gerritsen
fonte
7
Inicialmente, sua sugestão -prefer-source não funcionou até que percebi que tinha que remover e reinstalar todas as bibliotecas para que funcionasse como pretendia e, em seguida, composer status -vme deu as informações com as alterações.
Juliano
163

Basta limpar a pasta de fornecedores

rm -rf vendor/*
Zoran
fonte
@Loenix, desbloqueie-os.
Meia parada
7
Já tive casos em que o cache local foi corrompido, então, mesmo depois de excluir o diretório do fornecedor, continuei reinstalando uma dependência quebrada. composer clearcacheé um bom complemento em tais casos.
okdewit
3
Esta parece ser uma abordagem muito radical, considerando que o composer então precisa reinstalar todos os pacotes quando o OP precisa apenas de um pacote reinstalado. composer require vendor/packagefará o que o OP deseja e em menos tempo também. Estou um pouco surpreso que tantos tenham votado a favor desta resposta.
frederickjh
se composer clearcache não funcionar, você pode excluir o diretório /home/[username]/.cache. Isso forçará um novo download. Útil se você usar packagist do compositor privado, além de packagist.composer.org, e alguém fizer alterações sem adicionar uma nova tag.
Neil Davis
2
O Composer não instala necessariamente apenas no diretório do fornecedor, portanto, mesmo sendo uma abordagem pesada, ele não funciona em todas as situações.
ummdorian
35

Eu não queria excluir todos os pacotes do vendor/diretório, então aqui está como fiz:

  1. rm -rf vendor/package-i-messed-up
  2. composer install novamente
Yerke
fonte
4
ou 'composer require vendor / package-i-messed-up' também seria bom
aarcarr
1
Se isso não funcionar, você pode executar composer clearcacheprimeiro, caso o cache tenha sido corrompido por algum motivo.
Sean the Bean
26

O que eu fiz:

  1. Excluiu a pasta daquela biblioteca específica
  2. composer update --prefer-source vendor/library-name

Ele busca a biblioteca novamente junto com seu git repo

Attila Fulop
fonte
Se isso não funcionar, você pode executar composer clearcacheprimeiro, caso o cache tenha sido corrompido por algum motivo.
Sean the Bean
3

Como o usuário @aaracrr apontou em um comentário sobre outra resposta, provavelmente a melhor resposta é exigir novamente o pacote com a mesma restrição de versão.

ie.

composer require vendor/package

ou especificando uma restrição de versão

composer require vendor/package:^1.0.0
Frederickjh
fonte
1

Por alguma razão, ninguém sugeriu a maneira óbvia e mais direta de forçar a reinstalação:

> composer remove vendor-name/package-name && composer vendor-name/package-name
Yevgen
fonte
Funcionando como um encanto para mim, obrigado :)
Gucu112