Comment forcer le compositeur à réinstaller une bibliothèque?

97

J'utilise l'application squelette ZF2 et elle a un .gitignore qui empêche les bibliothèques externes d'être validées dans git. Pendant le débogage, j'aime aller changer des choses ici et là dans la source des bibliothèques pour apprendre comment les choses fonctionnent. Si ceux-ci étaient contrôlés par version, il serait très facile de les ramener à leur état d'origine.

Comment puis-je forcer Composer à réinstaller un framework particulier afin que je puisse à nouveau obtenir une nouvelle copie non modifiée?

PS: Veuillez ne pas suggérer de supprimer le fichier .gitignore car il est là pour une raison; cela empêche mes bibliothèques tierces d'entrer dans le référentiel de mon application. Je peux toujours les installer lors d'un déploiement automatisé.

julien
la source
2
Une option serait de supprimer composer.lock, puis d'exécuter l'installation de composer
vascowhite

Réponses:

48

Vous pouvez utiliser l' --prefer-sourceindicateur pour composer pour extraire des packages externes avec les informations VCS (le cas échéant). Vous pouvez simplement revenir à l'état d'origine. De plus, si vous émettez la composer updatecommande, le compositeur détectera toutes les modifications que vous avez apportées localement et vous demandera si vous souhaitez les annuler.

Votre fichier .gitignore est lié à votre projet racine (squelette ZF2) et il empêche le répertoire du fournisseur (où se trouvent vos bibliothèques tierces) de s'engager dans votre propre VCS. Le fichier ignore n'est pas lié aux dépôts git de vos fournisseurs.

Bram Gerritsen
la source
7
Au départ, votre suggestion -prefer-source n'a pas fonctionné jusqu'à ce que je réalise que je devais supprimer et réinstaller toutes les bibliothèques pour que cela fonctionne comme je le souhaitais, puis composer status -vme donner les informations avec les modifications.
Julian
167

Effacez simplement le dossier de vos fournisseurs

rm -rf vendor/*
Zoran
la source
@Loenix, déverrouillez-les.
Halfstop
7
J'ai eu des cas où le cache local était corrompu, donc même après avoir supprimé le répertoire du fournisseur, j'ai continué à réinstaller une dépendance cassée. composer clearcacheest un bon ajout dans de tels cas.
okdewit
3
Cela semble être une approche très radicale étant donné que composer a alors besoin de réinstaller tous les paquets lorsque l'OP n'a besoin que d'un seul paquet réinstallé. composer require vendor/packagefera ce que le PO veut et en moins de temps aussi. Je suis un peu surpris que tant de personnes aient voté pour cette réponse.
frederickjh
si le compositeur clearcache ne fonctionne pas, vous pouvez supprimer le répertoire /home/[nom_utilisateur ./.cache. Cela forcera un nouveau téléchargement. Utile si vous utilisez packagist de compositeur privé, en plus de packagist.composer.org, et que quelqu'un apporte des modifications sans ajouter de nouvelle balise.
Neil Davis
2
Composer n'installe pas nécessairement uniquement dans le répertoire du fournisseur, donc même en tant qu'approche lourde, il ne fonctionne pas dans toutes les situations.
ummdorian
35

Je ne voulais pas supprimer tous les packages du vendor/répertoire, voici donc comment je l'ai fait:

  1. rm -rf vendor/package-i-messed-up
  2. composer install encore
Yerke
la source
4
ou 'composer require vendor / package-i-messed-up' serait bien aussi
aarcarr
1
Si cela ne fonctionne pas, vous pouvez exécuter en composer clearcachepremier au cas où le cache serait corrompu pour une raison quelconque.
Sean the Bean
26

Ce que j'ai fait:

  1. Supprimé le dossier de cette bibliothèque particulière
  2. composer update --prefer-source vendor/library-name

Il récupère à nouveau la bibliothèque avec son repo git

Attila Fulop
la source
Si cela ne fonctionne pas, vous pouvez exécuter en composer clearcachepremier au cas où le cache serait corrompu pour une raison quelconque.
Sean the Bean le
3

Comme l'utilisateur @aaracrr l'a souligné dans un commentaire sur une autre réponse, la meilleure réponse est probablement de requérir à nouveau le package avec la même contrainte de version.

c'est à dire.

composer require vendor/package

ou en spécifiant une contrainte de version

composer require vendor/package:^1.0.0
frederickjh
la source
1

Pour une raison quelconque, personne n'a suggéré le moyen le plus évident et le plus simple de forcer la réinstallation:

> composer remove vendor-name/package-name && composer vendor-name/package-name
Yevgen
la source