Come si disinstallano tutte le dipendenze elencate in package.json (NPM)?


107

Se ho un file package.json definito nella root della mia applicazione e npm install -glo eseguo installerà tutte le dipendenze definite in package.json, globalmente.

Tuttavia, questo non sembra funzionare al contrario.

Se lo faccio npm uninstall -gnella mia applicazione root, viene generato un errore, richiedendomi di passargli un nome di pacchetto.

Questo non dovrebbe disinstallare anche gli stessi pacchetti che ho installato?

Sto facendo qualcosa di sbagliato?


1
Cordiali saluti, il mio ragionamento dietro a non usare mai npm -g. peterlyons.com/problog/2012/09/…
Peter Lyons

1
Ricorda che se vuoi usare un modulo per il tuo progetto, devi installarlo localmente. L'installazione di un modulo a livello globale fornisce solo più comandi nel tuo terminale, come ad esempio expressjs ed express (1).
warchimede

@sgwilly Ti sbagli di dover usare node_modules a livello globale - lo dice anche nella documentazione - nodejs.org/api/modules.html#modules_all_together - la funzione require () è 'intelligente' in quanto guarda in varie posizioni per provare a risolvere un percorso per un modulo che includa il nodo globale node_modules
qodeninja

Avrei dovuto essere più specifico: è vero che require () è abbastanza intelligente da trovare il tuo modulo installato a livello globale. Funzionerà se tutti i tuoi progetti dipendono dalla stessa versione di quel suddetto modulo. Tuttavia, potresti avere difficoltà a mantenere i progetti che si basano su diverse versioni del modulo se gestisci le dipendenze solo a livello globale. Ecco perché è consigliabile installare sempre i moduli in locale e installarli globalmente solo quando si desidera accedere ad alcuni comodi comandi eseguibili.
warchimede

@sgwilly - grazie per aver condiviso i tuoi pensieri qui - questo progetto in particolare è distribuibile quindi non dovrebbe provare ad aggiornare nulla - gli aggiornamenti effettivamente avverranno su RPM (nota RPM non NPM) e gli attuali node_modules sono rimpiccioliti - Avevo solo bisogno di un modo per ripulire rapidamente il sistema da qualunque cosa fosse installato l'RPM (nel mio ambiente di sviluppo)
qodeninja

Risposte:


168

Se si utilizza Bash, è sufficiente passare alla cartella contenente il file package.json ed eseguire quanto segue:

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

Nel caso di pacchetti installati a livello globale, passare alla %appdata%/npmcartella (se su Windows) ed eseguire lo stesso comando.

EDIT: questo comando rompe con npm 3.3.6 (Node 5.0). Ora sto usando il seguente comando Bash, che ho mappato a npm_uninstall_all nel mio file .bashrc:

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

Bonus aggiunto? è molto più veloce!

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


1
Hai pubblicato lo stesso identico comando come risposta a "Comando per rimuovere tutti i moduli npm a livello globale?". Come può essere la cosa appropriata da fare sia in quella situazione che in questa?
nessuno

@AndrewMedico In che modo non è appropriato? I pacchetti installati nel file package.json verranno installati nella cartella node_modules. Questo comando porterà ogni sottocartella nella cartella node_modules e verrà eseguito npm uninstall <package>per ogni cartella. L'ho fatto da solo e funziona in modo eccellente!
jedmao

2
@UgoRobain buona domanda. A quanto pare, alcune dipendenze diventano davvero profonde. Sul file system NTFS (Windows), almeno, ha problemi a rimuovere le directory in cui il nome del percorso è più lungo di un qualche tipo di limite, lasciando queste directory fantasma che non è possibile rimuovere. Fortunatamente, si npm uninstallprende cura di questo, motivo per cui questo trucco è utile.
jedmao

7
Ecco cosa facevo con PowerShell:foreach($package in ls node_modules){npm uninstall $package}
JustMaier

1
non sembra funzionare su Windows. tr is not recognized
Overdrivr

78

Questo ha funzionato per me:

prompt dei comandi o gitbash nella cartella node_modules nel tuo progetto, quindi esegui:

npm uninstall *

Rimossi tutti i pacchetti locali per quel progetto.


Questo non rimuove anche le installazioni globali?
shinzou

@shinzou Non ha rimosso le installazioni globali per me.
Taylor Edmiston

1
Su Mac 10.13.5, questo genera molti errori come di seguito "> heapdump@0.3.9 install / Users / vikramanna / node_modules / heapdump> node-gyp rebuild CXX (target) Release / obj.target / addon / src / heapdump. o Nel file incluso da ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: errore: nessun membro denominato "GetCpuProfiler" in "v8 :: Isolate" return isolate-> GetCpuProfiler () -> StartProfiling (titolo, record_samples); "
vikramvi

35

Per Windows vai alla directory node_modules ed eseguilo in PowerShell

npm uninstall (Get-ChildItem).Name 

Per me, questo genera l'errore "La riga di comando è troppo lunga".
Daniel

29

Recentemente ho trovato un comando node che consente di disinstallare tutte le dipendenze di sviluppo come segue:

npm prune --production

Come ho già detto, questo comando disinstalla solo i pacchetti di dipendenze di sviluppo. Almeno mi ha aiutato a non doverlo fare manualmente.


8

Suggerimento per gli utenti Windows: eseguire questo comando di PowerShell dalla node_modulesdirectory principale:

ls .\node_modules | % {npm uninstall $_}

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

Questo essenzialmente crea un falso package.json vuoto, chiama npm pruneper rimuovere tutto in node_modules, ripristina il package.json originale e reinstalla tutto.

Alcune delle altre soluzioni potrebbero essere più eleganti, ma sospetto che sia più veloce ed esauriente. Su altri thread ho visto persone suggerire semplicemente di eliminare la directory node_modules, ma almeno per Windows, questo fa sì che npm si blocchi in seguito perché la directory bin scompare. Forse su Linux viene ripristinato correttamente, ma non su Windows.


1
Nel mio caso - non avevo bisogno del package.json esistente (a causa dell'esecuzione dello script su CI dopo che gli script npm sono stati eseguiti ..) Quindi sono andato con: "echo {}> package.json & npm prune"
Rikki

5

In realtà non c'è alcuna opzione per farlo, se vuoi disinstallare i pacchetti da package.jsonfarlo semplicemente npm lssulla stessa directory che package.jsonsi basa e usa npm uninstall <name>o npm rm <name>per il pacchetto che vuoi rimuovere.


8
So come rimuoverli individualmente: avrebbe più senso se ci fosse un comando da eseguire sul file package.json nello stesso modo in cui funziona l'installazione di npm.
qodeninja

No, non vogliamo disinstallare a mano ogni modulo.
shinzou

1
  1. rimuovere le dipendenze indesiderate da package.json
  2. npm i

" npm i" non solo installerà i deps mancanti, ma aggiornerà node_modules in modo che corrispondano a package.json


1

( Non replicare questi passaggi finché non hai letto tutto )

Per me tutte le soluzioni menzionate non hanno funzionato. Così sono andato /usr/libe sono corso lì

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

Ma ha anche rimosso il npmpacchetto e solo metà dei pacchetti (fino a raggiungere la lettera n).

Quindi ho provato a installare nuovamente il nodo dalla guida del nodo.

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

Ma non è stato installato di npmnuovo.

Quindi ho deciso di reinstallare l'intero nodo sudo apt-get remove nodejs e di nuovo installare dalla guida sopra.

Ora NPM funziona di nuovo ma i moduli globali sono ancora presenti. Quindi ho controllato il contenuto della directory /usr/lib/node_modulese sembra che l'unica cosa importante qui sia npm. Quindi ho modificato il comando sopra per disinstallare tutto trannenpm

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

Ha rimosso tutti i moduli che non erano prefissati @. Così ho esteso il ciclo per le sottodirectory.

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;

Il mio /usr/lib/node_modulesora contiene solo npmpacchetti collegati.


0

Anche tu non hai bisogno di eseguire il ciclo per quello.

È possibile eliminare tutti i node_modules utilizzando l'unico singolo comando: -

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

0

Utenti di Powershell: foreach($package in ls node_modules){npm uninstall $package}

Grazie @JustMailer


0

Piggy-backing off di Vikas Kohli e jedmao , si può fare questo

versione linea singola:

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' ' '`

versione multistrato:

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' ' '`

0

Un'altra opzione SEMPLICE è quella di eliminare node_modules e package-lock.json

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

Dopo questo puoi provare a reinstallare i pacchetti npm

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.