Come forzare il compositore a reinstallare una libreria?


96

Sto usando l'app skeleton ZF2 e ha un .gitignore che impedisce alle librerie esterne di essere impegnate su git. Durante il debug mi piace andare a cambiare le cose qua e là nei sorgenti delle librerie per imparare come funzionano le cose. Se fossero controllati dalla versione, sarebbe molto facile ripristinarli allo stato originale.

Come posso forzare Composer a reinstallare un particolare framework in modo da poter ottenere di nuovo una nuova copia non modificata?

PS: per favore non suggerire di rimuovere il file .gitignore poiché è lì per un motivo; impedisce alle mie librerie di terze parti di entrare nel repository della mia app. Posso sempre installarli durante una distribuzione automatizzata.


2
Un'opzione potrebbe essere quella di eliminare composer.lock e quindi eseguire l'installazione di composer
vascowhite

Risposte:


48

È possibile utilizzare il --prefer-sourceflag per il compositore per eseguire il checkout di pacchetti esterni con le informazioni VCS (se disponibili). Puoi semplicemente tornare allo stato originale. Inoltre, se esegui il composer updatecomando, il compositore rileverà tutte le modifiche apportate localmente e ti chiederà se vuoi scartarle.

Il tuo file .gitignore è correlato al tuo progetto root (scheletro ZF2) e impedisce alla directory del fornitore (dove si trovano le tue librerie di terze parti) di impegnarsi nel tuo VCS. Il file ignora non è correlato ai repository git dei tuoi fornitori.


7
Inizialmente il tuo suggerimento -prefer-source non ha funzionato fino a quando non mi sono reso conto che dovevo rimuovere e reinstallare tutte le librerie affinché funzionasse come volevo e poi composer status -vmi ha dato le informazioni con le modifiche.
Julian

163

Basta svuotare la cartella dei fornitori

rm -rf vendor/*

@Loenix, sbloccali.
Halfstop

7
Ho avuto casi in cui la cache locale era danneggiata, quindi anche dopo aver eliminato la directory del fornitore ho continuato a reinstallare una dipendenza interrotta. composer clearcacheè una buona aggiunta in questi casi.
okdewit

3
Questo sembra un approccio molto radicale considerando che il compositore deve quindi reinstallare tutti i pacchetti quando l'OP necessita solo di un pacchetto reinstallato. composer require vendor/packagefarà quello che vuole l'OP e anche in meno tempo. Sono un po 'sorpreso che così tanti abbiano votato positivamente questa risposta.
frederickjh

se il composer clearcache non funziona, puoi eliminare la directory /home/[username”/.cache. Questo forzerà un nuovo download. Utile se usi il compositore privato packagist, oltre a packagist.composer.org, e qualcuno apporta modifiche senza aggiungere un nuovo tag.
Neil Davis

2
Composer non si installa necessariamente solo nella directory del fornitore, quindi anche come approccio pesante non funziona in tutte le situazioni.
ummdorian

35

Non volevo eliminare tutti i pacchetti nella vendor/directory, quindi ecco come l'ho fatto:

  1. rm -rf vendor/package-i-messed-up
  2. composer install ancora

4
oppure "il compositore richiede fornitore / pacchetto-i-incasinato" sarebbe buono anche
aarcarr

1
Se non funziona, potresti eseguire composer clearcacheprima nel caso in cui la cache sia stata danneggiata per qualche motivo.
Sean the Bean

26

Cosa ho fatto:

  1. Eliminata la cartella di quella particolare libreria
  2. composer update --prefer-source vendor/library-name

Recupera di nuovo la libreria insieme al suo repository git


Se non funziona, potresti eseguire composer clearcacheprima nel caso in cui la cache sia stata danneggiata per qualche motivo.
Sean the Bean


3

Come ha sottolineato l'utente @aaracrr in un commento su un'altra risposta, probabilmente la risposta migliore è richiedere nuovamente il pacchetto con lo stesso vincolo di versione.

cioè.

composer require vendor/package

o specificando un vincolo di versione

composer require vendor/package:^1.0.0

1

Per qualche motivo nessuno ha suggerito il modo più ovvio e diretto per forzare la reinstallazione:

> composer remove vendor-name/package-name && composer vendor-name/package-name

Funzionando come un incantesimo per me, grazie :)
Gucu112
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.