¿Cómo obligar al compositor a reinstalar una biblioteca?

97

Estoy usando la aplicación esqueleto ZF2 y tiene un .gitignore que evita que las bibliotecas externas se comprometan con git. Mientras depuro, me gusta ir y cambiar cosas aquí y allá en la fuente de las bibliotecas para aprender cómo funcionan las cosas. Si fueran versiones controladas, sería muy fácil revertirlas a su estado original.

¿Cómo puedo obligar a Composer a reinstalar un marco en particular para poder obtener una copia nueva, sin modificar, nuevamente?

PD: No sugiera eliminar el archivo .gitignore ya que está allí por una razón; evita que mis bibliotecas de terceros entren en el repositorio de mi aplicación. Siempre puedo instalarlos durante una implementación automatizada.

Julian
fuente
2
Una opción sería eliminar composer.lock y luego ejecutar composer install
vascowhite

Respuestas:

48

Puede usar la --prefer-sourcebandera del compositor para verificar paquetes externos con la información de VCS (si hay alguno disponible). Simplemente puede volver al estado original. Además, si emite el composer updatecomando, el compositor detectará los cambios que realizó localmente y le preguntará si desea descartarlos.

Su archivo .gitignore está relacionado con su proyecto raíz (esqueleto ZF2) y evita que el directorio del proveedor (donde están sus bibliotecas de terceros) se comprometa con su propio VCS. El archivo ignorado no está relacionado con los repositorios git de sus proveedores.

Bram Gerritsen
fuente
7
Inicialmente, su sugerencia de -prefer-source no funcionó hasta que me di cuenta de que tenía que eliminar y reinstalar todas las bibliotecas para que esto funcionara como quería y luego composer status -vme proporcionó la información con los cambios.
Julián
167

Simplemente borre su carpeta de proveedores

rm -rf vendor/*
Zoran
fuente
@Loenix, desbloquéalos.
Halfstop
7
He tenido casos en los que la caché local estaba dañada, por lo que incluso después de eliminar el directorio de proveedores seguí reinstalando una dependencia rota. composer clearcachees una buena adición en tales casos.
okdewit
3
Esto parece un enfoque muy radical teniendo en cuenta que el compositor necesita reinstalar todos los paquetes cuando el OP solo necesita reinstalar un paquete. composer require vendor/packagehará lo que quiera el OP y en menos tiempo también. Me sorprende un poco que tantos hayan votado a favor de esta respuesta.
frederickjh
si composer clearcache no funciona, puede eliminar el directorio /home/[username]/.cache. Eso forzará una nueva descarga. Útil si usa packagist compositor privado, además de packagist.composer.org, y alguien realiza cambios sin agregar una etiqueta nueva.
Neil Davis
2
Composer no necesariamente se instala solo en el directorio de proveedores, por lo que incluso como un enfoque de mano dura no funciona en todas las situaciones.
ummdorian
36

No quería eliminar todos los paquetes en el vendor/directorio, así que así es como lo hice:

  1. rm -rf vendor/package-i-messed-up
  2. composer install de nuevo
Yerke
fuente
4
o 'composer require vendor / package-i-messed-up' también sería bueno
aarcarr
1
Si eso no funciona, puede ejecutar composer clearcacheprimero en caso de que el caché se dañe por alguna razón.
Sean the Bean
26

Lo que hice:

  1. Eliminó la carpeta de esa biblioteca en particular
  2. composer update --prefer-source vendor/library-name

Vuelve a buscar la biblioteca junto con su repositorio de git

Attila Fulop
fuente
Si eso no funciona, puede ejecutar composer clearcacheprimero en caso de que el caché se dañe por alguna razón.
Sean the Bean
3

Como el usuario @aaracrr señaló en un comentario sobre otra respuesta, probablemente la mejor respuesta sea volver a requerir el paquete con la misma restricción de versión.

es decir.

composer require vendor/package

o especificando una restricción de versión

composer require vendor/package:^1.0.0
frederickjh
fuente
1

Por alguna razón, nadie sugirió la forma obvia y más sencilla de forzar la reinstalación:

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