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.


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.


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/*

@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

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


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

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

Funcionando como um encanto para mim, obrigado :)
Gucu112
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.