Jak zmusić kompozytora do ponownej instalacji biblioteki?

102

Używam szkieletowej aplikacji ZF2 i ma ona plik .gitignore, który zapobiega przekazywaniu bibliotek zewnętrznych do git. Podczas debugowania lubię zmieniać rzeczy tu i tam w źródłach bibliotek, aby dowiedzieć się, jak to działa. Gdyby były one kontrolowane przez wersję, byłoby bardzo łatwo przywrócić je do ich pierwotnego stanu.

Jak zmusić Composera do ponownej instalacji określonego frameworka, aby móc ponownie otrzymać świeżą, niezmodyfikowaną kopię?

PS: Nie sugeruj usuwania pliku .gitignore, ponieważ istnieje z jakiegoś powodu; zapobiega przedostawaniu się bibliotek innych firm do repozytorium mojej aplikacji. Zawsze mogę je zainstalować podczas automatycznego wdrażania.

juliański
źródło
2
Jedną z opcji byłoby usunięcie
pliku

Odpowiedzi:

50

Możesz użyć --prefer-sourceflagi dla kompozytora, aby pobrać zewnętrzne pakiety z informacjami VCS (jeśli są dostępne). Możesz po prostu powrócić do pierwotnego stanu. Również jeśli wydasz composer updatepolecenie, kompozytor wykryje wszelkie zmiany, które wprowadziłeś lokalnie i zapyta, czy chcesz je odrzucić.

Twój plik .gitignore jest powiązany z Twoim głównym projektem (szkielet ZF2) i uniemożliwia katalogowi dostawcy (gdzie znajdują się biblioteki innych firm) przypisywanie się do Twojego własnego VCS. Plik ignorowania nie jest powiązany z repozytoriami git Twoich dostawców.

Bram Gerritsen
źródło
7
Początkowo twoja sugestia -prefer-source nie zadziałała, dopóki nie zdałem sobie sprawy, że muszę usunąć i ponownie zainstalować wszystkie biblioteki, aby to działało tak, jak zamierzałem, a następnie composer status -vprzekazałem mi informacje o zmianach.
Julian
173

Po prostu wyczyść folder dostawców

rm -rf vendor/*
Zoran
źródło
@Loenix, odblokuj je.
Halfstop
8
Miałem przypadki, w których lokalna pamięć podręczna była uszkodzona, więc nawet po usunięciu katalogu dostawcy kontynuowałem ponowne instalowanie zepsutej zależności. composer clearcachejest dobrym dodatkiem w takich przypadkach.
okdewit
3
Wydaje się to bardzo radykalnym podejściem, biorąc pod uwagę, że kompozytor musi następnie ponownie zainstalować wszystkie pakiety, gdy OP wymaga tylko ponownego zainstalowania jednego pakietu. composer require vendor/packagezrobi to, czego chce PO iw krótszym czasie. Jestem trochę zaskoczony, że tak wielu pozytywnie zagłosowało na tę odpowiedź.
frederickjh
jeśli composer clearcache nie działa, możesz usunąć katalog /home/[ nazwa_użytkownika ]/.cache. To wymusi ponowne pobranie. Przydatne, jeśli oprócz packagist.composer.org korzystasz z prywatnego pakietu kompozytorów i ktoś wprowadza zmiany bez dodawania nowego tagu.
Neil Davis
2
Composer niekoniecznie musi instalować się tylko w katalogu dostawcy, więc nawet przy uciążliwym podejściu nie działa we wszystkich sytuacjach.
ummdorian
38

Nie chciałem usuwać wszystkich pakietów w vendor/katalogu, więc oto jak to zrobiłem:

  1. rm -rf vendor/package-i-messed-up
  2. composer install jeszcze raz
Yerke
źródło
4
lub „kompozytor wymaga dostawcy / pakietu-i-pomieszany-up” też byłoby dobre
aarcarr
1
Jeśli to nie zadziała, możesz uruchomić composer clearcachenajpierw na wypadek, gdyby pamięć podręczna została z jakiegoś powodu uszkodzona.
Sean the Bean
27

Co ja zrobiłem:

  1. Usunięto folder tej konkretnej biblioteki
  2. composer update --prefer-source vendor/library-name

Ponownie pobiera bibliotekę wraz z repozytorium git

Attila Fulop
źródło
Jeśli to nie zadziała, możesz uruchomić composer clearcachenajpierw na wypadek, gdyby pamięć podręczna została z jakiegoś powodu uszkodzona.
Sean the Bean
3

Jak zauważył użytkownik @aaracrr w komentarzu do innej odpowiedzi, prawdopodobnie najlepszą odpowiedzią jest ponowne zażądanie pakietu z tym samym ograniczeniem wersji.

to znaczy.

composer require vendor/package

lub określając ograniczenie wersji

composer require vendor/package:^1.0.0
frederickjh
źródło
2

Z jakiegoś powodu nikt nie zasugerował oczywistego i najprostszego sposobu wymuszenia ponownej instalacji:

> composer remove vendor-name/package-name && composer vendor-name/package-name
Yevgen
źródło