¿Cómo eliminar dependencias no utilizadas del compositor?

210

Instalé un paquete con Composer, e instaló muchos otros paquetes como dependencias.

Ahora desinstalé el paquete principal con composer remove packageauthor/packagename, pero no se eliminaron todas las dependencias antiguas. Esperaba que el compositor limpiara y solo mantuviera los paquetes requeridos de acuerdo con composer.jsonsus dependencias.

¿Cómo puedo forzar al compositor a limpiar y eliminar todos los paquetes no utilizados?

Lorenz Meyer
fuente

Respuestas:

377

La forma correcta de hacer esto es:

composer remove jenssegers/mongodb --update-with-dependencies

Debo admitir que la bandera aquí no es tan obvia en cuanto a lo que hará.

Actualizar

composer remove jenssegers/mongodb

A partir de v1.0.0-beta2 --update-with-dependencies es el valor predeterminado y ya no es necesario.

Denis Pshenov
fuente
gracias a @Yehosef por comenzar el problema en github donde se proporcionó una solución, pero como no actualizó su respuesta, decidí escribir la mía para conveniencia de todos
Denis Pshenov
Gracias, no entendí el final de su discusión.
Lorenz Meyer
3
Una cosa a tener en cuenta: si ya lo ha hecho composer remove …, pero se olvidó --update-with-dependencieshasta que tropezó con esta pregunta: las llamadas posteriores a composer removeno matarán todas las dependencias. Tendrá que revertir, compositor install, entoncescomposer remove --update-with-dependencies
Mike G
Ahora recibo el siguiente mensaje:You are using the deprecated option "update-with-dependencies". This is now default behaviour. The --no-update-with-dependencies option can be used to remove a package without its dependencies
Pathros
44
¿Qué tal la limpieza después de la eliminación de un paquete? - Ahí es donde entra la respuesta de @LorenzMeyer: aprobado composer updatea esta respuesta a @LorenzMeyer
Allen Linatoc
29

De hecho, es muy fácil.

composer update

hará todo esto por usted, pero también actualizará los otros paquetes.

Para eliminar un paquete sin actualizar los demás, especifique ese paquete en el comando, por ejemplo:

composer update monolog/monolog

eliminará el monolog/monologpaquete

Sin embargo, pueden quedar algunas carpetas o archivos vacíos que no pueden eliminarse automáticamente y que deben eliminarse manualmente.

Lorenz Meyer
fuente
8
La parte desafortunada de esto es que te obliga a actualizar tus paquetes en lugar de solo eliminar versiones antiguas. Por ejemplo, si tengo dos paquetes AAA / aaa ~ 1 y la versión BBB / bbb ~ 2 y actualmente estoy en la versión 1.0 de AAA / aaa y lanzaron 1.1, cuando elimino BBB / bbb, me actualizo automáticamente (lo que puede que no ser lo que tenía la intención de hacer ...)
Yehosef
Tienes razón. Si tiene una solución mejor, regrese y publíquela como respuesta.
Lorenz Meyer
3
Todavía no, solo quiero señalar a los demás una trampa de este enfoque.
Yehosef
realmente debería ser una bandera en la instalación del compositor ... algo así como--prune
Yehosef
1
si le gusta la idea, puede votarla - github.com/composer/composer/issues/3751
Yehosef
20

los siguientes comandos harán lo mismo perfectamente

rm -rf vendor

composer install 
Max Wen
fuente
2
Esta parece ser la opción más limpia. Elimine el directorio de proveedores y deje que Composer obtenga todo nuevo.
Machavity
44
este es el estilo npm "save my day";)
r34
composer installeliminará automáticamente los paquetes no utilizados
Yidir
10

Simplemente ejecute composer install: hará que su vendordirectorio refleje las dependencias en el composer.lockarchivo.

En otras palabras, eliminará a cualquier proveedor que falte composer.lock.

Actualice el propio compositor antes de ejecutar esto.

Valentas
fuente