¿Cómo desinstalas todas las dependencias enumeradas en package.json (NPM)?

107

Si tengo un archivo package.json definido en la raíz de mi aplicación y lo ejecuto npm install -g, se instalarán todas las dependencias definidas en package.json, globalmente.

Sin embargo, esto no parece funcionar a la inversa.

Si lo hago npm uninstall -gen la raíz de mi aplicación, arroja un error, explicándome que le pase un nombre de paquete.

¿No debería esto desinstalar también los mismos paquetes que instalé?

¿Estoy haciendo algo mal?

qodeninja
fuente
1
Para su información, mi razonamiento detrás de nunca usar npm -g. peterlyons.com/problog/2012/09/…
Peter Lyons
1
Recuerde que si desea utilizar un módulo para su proyecto, debe instalarlo localmente. Instalar un módulo globalmente solo proporciona más comandos en su terminal, como con expressjs y express (1) por ejemplo.
warchimede
@sgwilly Te equivocas al tener que usar node_modules globalmente, incluso lo dice en la documentación - nodejs.org/api/modules.html#modules_all_together - la función require () es 'inteligente' porque se ve en varias ubicaciones para intentar resolver una ruta para un módulo que incluye los módulos node_modules globales
qodeninja
Debería haber sido más específico: es cierto que require () es lo suficientemente inteligente como para encontrar su módulo instalado globalmente. Funcionará si todos sus proyectos dependen de la misma versión de dicho módulo. Sin embargo, es posible que tenga dificultades para mantener proyectos que se basan en diferentes versiones de módulos si solo administra las dependencias de manera global. Es por eso que es una buena práctica instalar siempre módulos localmente y solo instalarlos globalmente cuando desee obtener acceso a algunos comandos ejecutables útiles.
warchimede
@sgwilly - gracias por compartir sus pensamientos aquí - este proyecto en particular es distribuible, por lo que no debería intentar actualizar nada - las actualizaciones en realidad ocurrirán a través de RPM (tenga en cuenta RPM, no NPM) y los node_modules reales están reducidos - Solo necesitaba una forma de limpiar rápidamente el sistema de lo que sea que las rpm
terminen

Respuestas:

168

Si usa Bash, simplemente cambie a la carpeta que tiene su archivo package.json y ejecute lo siguiente:

for package in `ls node_modules`; do npm uninstall $package; done;

En el caso de paquetes instalados globalmente, cambie a su %appdata%/npmcarpeta (si está en Windows) y ejecute el mismo comando.

EDITAR: Este comando rompe con npm 3.3.6 (Nodo 5.0). Ahora estoy usando el siguiente comando Bash, que he asignado a npm_uninstall_all en mi archivo .bashrc:

npm uninstall `ls -1 node_modules | tr '/\n' ' '`

¿Bono agregado? ¡es mucho más rápido!

https://github.com/npm/npm/issues/10187

jedmao
fuente
1
Publicó exactamente el mismo comando como respuesta a "¿Comando para eliminar todos los módulos npm globalmente?". ¿Cómo puede ser esto lo apropiado para hacer tanto en esa situación como en esta?
nadie
@AndrewMedico ¿Cómo no es apropiado? Los paquetes instalados en su archivo package.json se instalarán en su carpeta node_modules. Este comando llevará cada subcarpeta a la carpeta node_modules y se ejecutará npm uninstall <package>para cada carpeta. ¡Hice esto yo mismo y funciona excelentemente!
jedmao
2
@UgoRobain buena pregunta. Resulta que algunas dependencias se vuelven realmente profundas. En el sistema de archivos NTFS (Windows), al menos, tiene problemas para eliminar directorios donde el nombre de la ruta es más largo que algún tipo de límite, dejando estos directorios fantasmas que no puede eliminar. Afortunadamente, npm uninstallse encarga de eso, razón por la cual este truco es útil.
Jedmao
7
Esto es lo que solía hacer con powershell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier
1
no parece funcionar en Windows. tr is not recognized
Overdrivr
78

Esto funcionó para mí:

símbolo del sistema o gitbash en la carpeta node_modules en su proyecto y luego ejecute:

npm uninstall *

Se eliminaron todos los paquetes locales para ese proyecto.

Druubacca
fuente
¿No elimina esto también las instalaciones globales?
shinzou
@shinzou No eliminó las instalaciones globales para mí.
Taylor Edmiston
1
En Mac 10.13.5, esto arroja muchos errores como se muestra a continuación "> [email protected] install / Users / vikramanna / node_modules / heapdump> node-gyp rebuild CXX (target) Release / obj.target / addon / src / heapdump. o En el archivo incluido de ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: error: ningún miembro llamado 'GetCpuProfiler' en 'v8 :: Isolate' return isolate-> GetCpuProfiler () -> StartProfiling (título, record_samples); "
vikramvi
35

Para Windows, vaya al directorio node_modules y ejecute esto en powershell

npm uninstall (Get-ChildItem).Name 
Sameer
fuente
Para mí, esto da como resultado el error "La línea de comando es demasiado larga".
Daniel
29

Recientemente encontré un comando de nodo que permite desinstalar todas las dependencias de desarrollo de la siguiente manera:

npm prune --production

Como mencioné, este comando solo desinstala los paquetes de dependencia de desarrollo. Al menos me ayudó a no tener que hacerlo manualmente.

chalo
fuente
8

Sugerencia para usuarios de Windows: Ejecute este comando de PowerShell desde el node_modulesdirectorio principal:

ls .\node_modules | % {npm uninstall $_}
y0n1
fuente
6
// forcibly remove and reinstall all package dependencies
ren package.json package.json-bak
echo {} > package.json
npm prune
del package.json
ren package.json-bak package.json
npm i

Esto esencialmente crea un package.json falso y vacío, llama npm prunepara eliminar todo en node_modules, restaura el package.json original y reinstala todo.

Algunas de las otras soluciones pueden ser más elegantes, pero sospecho que esto es más rápido y exhaustivo. En otros hilos, he visto personas sugerir simplemente eliminar el directorio node_modules, pero al menos para Windows, esto hace que npm se ahogue después porque el directorio bin desaparece. Tal vez en Linux se restaure correctamente, pero no en Windows.

mami
fuente
1
En mi caso, no necesitaba el package.json existente (debido a que ejecuté el script en CI después de que se ejecutaron los scripts npm ..) Así que simplemente fui con: "echo {}> package.json & npm prune"
Rikki
5

En realidad, no hay ninguna opción para hacer eso, si desea desinstalar paquetes, package.jsonsimplemente hágalo npm lsen el mismo directorio que se package.jsonbasa y usa npm uninstall <name>o npm rm <name>para el paquete que desea eliminar.

Gntem
fuente
8
Sé cómo eliminarlos individualmente; tendría más sentido si hubiera un comando que se ejecutara en el archivo package.json de la misma manera que funciona la instalación npm.
qodeninja
No, no queremos desinstalar a mano todos los módulos.
shinzou
1
  1. eliminar las dependencias no deseadas de package.json
  2. npm i

" npm i" no solo instalará los deps que faltan, sino que también actualizará node_modules para que coincida con el package.json

Misaka_0x447f
fuente
1

( No repita estos pasos hasta que haya leído todo )

Para mí, todas las soluciones mencionadas no funcionaron. Así que fui /usr/liby corrí allí

for package in `ls node_modules`; do sudo npm uninstall $package; done;

Pero también eliminó el npmpaquete y solo la mitad de los paquetes (hasta que llegó a la letra n).

Así que intenté instalar el nodo nuevamente con la guía del nodo.

# Using Ubuntu
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

Pero no se instaló de npmnuevo.

Así que decidí reinstalar todo el nodo sudo apt-get remove nodejs y volver a instalarlo según la guía anterior.

Ahora NPM está funcionando nuevamente, pero los módulos globales todavía están allí. Así que verifiqué el contenido del directorio /usr/lib/node_modulesy parece que lo único importante aquí es npm. Así que edité el comando anterior para desinstalar todo exceptonpm

for package in $(ls node_modules); do if [ "$package" != "npm" ]; then sudo npm uninstall $package; fi; done;

Eliminó todos los módulos que no tenían prefijos @. Entonces extendí el ciclo para subdirectorios.

for package in $(ls node_modules); do if [  ${package:0:1} = \@ ]; then 
        for innerPackage in $(ls node_modules/${package}); do
                sudo npm uninstall "$package/$innerPackage";
        done;
fi; done;

Mi /usr/lib/node_modulesahora contiene solo npmpaquetes vinculados.

siOnzee
fuente
0

Incluso no es necesario ejecutar el ciclo para eso.

Puede eliminar todos los node_modules usando el único comando: -

npm uninstall `ls -1 node_modules | tr '/\n' ' '`
VIKAS KOHLI
fuente
0

Usuarios de Powershell: foreach($package in ls node_modules){npm uninstall $package}

Gracias @JustMailer

San Valentín Bondar
fuente
0

A cuestas de VIKAS KOHLI y jedmao , puedes hacer esto

versión de una sola línea:

npm uninstall `ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` `find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`

versión de varias líneas:

npm uninstall \
`ls -1 node_modules | grep -v ^@ | tr '/\n' ' '` \
`find node_modules/@* -type d -depth 1 2>/dev/null | cut -d/ -f2-3 | tr '\n' ' '`
Ryan Lecha
fuente
0

Otra opción SIMPLE es eliminar node_modules y package-lock.json

rm -rf node_modules
rm -rf package-lock.json

Después de esto, puede intentar reinstalar los paquetes npm

Duro Phoujdar
fuente