Wie deinstallieren Sie alle in package.json (NPM) aufgeführten Abhängigkeiten?

107

Wenn ich eine package.json-Datei in meinem Anwendungsstamm definiert und ausgeführt npm install -ghabe, werden alle in package.json definierten Abhängigkeiten global installiert.

Dies scheint jedoch nicht umgekehrt zu funktionieren.

Wenn ich dies npm uninstall -gin meinem Anwendungsstamm tue, wird ein Fehler ausgegeben, der mich dazu veranlasst, ihm einen Paketnamen zu übergeben.

Sollte dies nicht auch die gleichen Pakete deinstallieren, die ich installiert habe?

Mache ich etwas falsch?

Qodeninja
quelle
1
Zu Ihrer Information, meine Argumentation dahinter, niemals npm -g zu verwenden. peterlyons.com/problog/2012/09/…
Peter Lyons
1
Denken Sie daran, dass Sie ein Modul lokal installieren müssen, wenn Sie es für Ihr Projekt verwenden möchten. Die globale Installation eines Moduls bietet nur mehr Befehle in Ihrem Terminal, wie beispielsweise bei expressjs und express (1).
Warchimede
@sgwilly Sie haben Unrecht, wenn Sie node_modules global verwenden müssen - dies steht sogar in der Dokumentation - nodejs.org/api/modules.html#modules_all_together -. Die Funktion require () ist insofern "intelligent", als sie an verschiedenen Orten angezeigt wird um zu versuchen, einen Pfad für ein Modul einschließlich der globalen node_modules aufzulösen
qodeninja
Ich hätte genauer sein sollen: Es ist wahr, dass require () klug genug ist, um Ihr global installiertes Modul zu finden. Es funktioniert, wenn alle Ihre Projekte von derselben Version dieses Moduls abhängen. Es kann jedoch schwierig sein, Projekte zu verwalten, die auf unterschiedlichen Modulversionen basieren, wenn Sie Abhängigkeiten nur global verwalten. Aus diesem Grund empfiehlt es sich, Module immer lokal zu installieren und nur dann global zu installieren, wenn Sie Zugriff auf einige praktische ausführbare Befehle erhalten möchten.
Warchimede
@sgwilly - danke, dass du deine Gedanken hier geteilt hast - dieses Projekt ist insbesondere verteilbar, daher sollte es nicht versuchen, etwas zu aktualisieren - die tatsächlichen Aktualisierungen erfolgen über RPM (Anmerkung RPM nicht NPM) und die tatsächlichen node_modules werden verkleinert - Ich brauchte nur einen Weg, um das System schnell von der Installation der Drehzahl zu reinigen (in meiner
Entwicklungsumgebung

Antworten:

167

Wenn Sie Bash verwenden, wechseln Sie einfach in den Ordner mit Ihrer Datei package.json und führen Sie Folgendes aus:

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

Wechseln Sie bei global installierten Paketen in Ihren %appdata%/npmOrdner (unter Windows) und führen Sie denselben Befehl aus.

BEARBEITEN: Dieser Befehl bricht mit npm 3.3.6 (Knoten 5.0) ab. Ich verwende jetzt den folgenden Bash-Befehl, den ich in meiner .bashrc-Datei npm_uninstall_all zugeordnet habe:

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

Bonus hinzugefügt? es ist viel schneller!

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

jedmao
quelle
1
Sie haben genau den gleichen Befehl als Antwort auf "Befehl zum globalen Entfernen aller npm-Module?" Veröffentlicht. Wie kann dies sowohl in dieser als auch in dieser Situation angemessen sein?
niemand
@ AndrewMedico Wie ist es nicht angemessen? In Ihrer Datei package.json installierte Pakete werden in Ihrem Ordner node_modules installiert. Dieser Befehl führt jeden Unterordner in den Ordner node_modules und wird npm uninstall <package>für jeden Ordner ausgeführt. Ich habe das selbst gemacht und es funktioniert hervorragend!
jedmao
2
@UgoRobain gute Frage. Wie sich herausstellt, werden einige Abhängigkeiten sehr tief. Zumindest im NTFS-Dateisystem (Windows) treten Probleme beim Entfernen von Verzeichnissen auf, bei denen der Pfadname länger als eine bestimmte Grenze ist, sodass diese Phantomverzeichnisse nicht entfernt werden können. Glücklicherweise npm uninstallkümmert sich das darum, weshalb dieser Trick nützlich ist.
jedmao
7
Folgendes habe ich früher mit Powershell gemacht:foreach($package in ls node_modules){npm uninstall $package}
JustMaier
1
scheint unter Windows nicht zu funktionieren. tr is not recognized
Overdrivr
78

Das hat bei mir funktioniert:

Eingabeaufforderung oder gitbash in den Ordner node_modules in Ihrem Projekt und führen Sie dann Folgendes aus:

npm uninstall *

Alle lokalen Pakete für dieses Projekt wurden entfernt.

Druubacca
quelle
Entfernt dies nicht auch globale Installationen?
Shinzou
@shinzou Globale Installationen wurden für mich nicht entfernt.
Taylor Edmiston
1
Unter Mac 10.13.5 führt dies wie folgt zu vielen Fehlern: "> [email protected] install / Users / vikramanna / node_modules / heapdump> Neuaufbau von CXX (Ziel) Release / obj.target / addon / src / heapdump. o In der Datei von ../src/heapdump.cc:17: ../src/compat-inl.h:300:19: Fehler: Kein Mitglied mit dem Namen 'GetCpuProfiler' in 'v8 :: Isolate' gibt isolate-> zurück GetCpuProfiler () -> StartProfiling (title, record_samples); "
Vikramvi
35

Für Windows gehen Sie zu node_modules dir und führen Sie dies in Powershell aus

npm uninstall (Get-ChildItem).Name 
Sameer
quelle
Für mich führt dies zu dem Fehler "Die Befehlszeile ist zu lang."
Daniel
29

Ich habe kürzlich einen Knotenbefehl gefunden, mit dem alle Entwicklungsabhängigkeiten wie folgt deinstalliert werden können:

npm prune --production

Wie bereits erwähnt, deinstalliert dieser Befehl nur die Entwicklungsabhängigkeitspakete. Zumindest hat es mir geholfen, es nicht manuell machen zu müssen.

Chalo
quelle
8

Tipp für Windows-Benutzer: Führen Sie diesen PowerShell-Befehl im node_modulesübergeordneten Verzeichnis aus:

ls .\node_modules | % {npm uninstall $_}
y0n1
quelle
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

Dies erstellt im Wesentlichen eine gefälschte, leere package.json, ruft npm pruneauf, um alles in node_modules zu entfernen, stellt die ursprüngliche package.json wieder her und installiert alles neu.

Einige der anderen Lösungen mögen eleganter sein, aber ich vermute, dass dies schneller und umfassender ist. In anderen Threads habe ich gesehen, dass Leute vorgeschlagen haben, nur das Verzeichnis node_modules zu löschen, aber zumindest für Windows führt dies dazu, dass npm danach erstickt, weil das bin-Verzeichnis fehlt. Vielleicht wird es unter Linux richtig wiederhergestellt, aber nicht unter Windows.

meem
quelle
1
In meinem Fall - ich brauchte das vorhandene package.json nicht (weil das Skript auf CI ausgeführt wurde, nachdem npm-Skripte ausgeführt wurden ..). Also ging ich einfach mit: "echo {}> package.json & npm prune"
Rikki
5

Eigentlich gibt es keine Möglichkeit , das zu tun, wenn Sie von zu deinstallieren Pakete wollen package.jsoneinfach tun npm lsauf dem gleichen Verzeichnis , das package.jsonberuht und die Verwendung npm uninstall <name>oder npm rm <name>für das Paket , das Sie entfernen möchten.

Gntem
quelle
8
Ich weiß, wie man sie einzeln entfernt - es wäre nur sinnvoller, wenn es einen Befehl gäbe, der auf die gleiche Weise wie die npm-Installation für die Datei package.json ausgeführt wird.
Qodeninja
Nein, wir möchten nicht jedes Modul von Hand deinstallieren.
Shinzou
1
  1. Entfernen Sie unerwünschte Abhängigkeiten aus package.json
  2. npm i

" npm i" installiert nicht nur fehlende Deps, sondern aktualisiert auch node_modules so, dass sie mit package.json übereinstimmen

Misaka_0x447f
quelle
1

( Replizieren Sie diese Schritte erst, wenn Sie alles gelesen haben. )

Bei mir haben alle genannten Lösungen nicht funktioniert. Also ging ich zu /usr/libund rannte dorthin

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

Es wurden aber auch das npmPaket und nur die Hälfte der Pakete entfernt (bis es den Buchstaben n erreichte).

Also habe ich versucht, den Knoten erneut über die Knotenanleitung zu installieren.

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

Aber es wurde nicht npmerneut installiert .

Also habe ich beschlossen, den gesamten Knoten neu zu installieren sudo apt-get remove nodejs und erneut gemäß der obigen Anleitung zu installieren.

Jetzt funktioniert NPM wieder, aber die globalen Module sind noch da. Also habe ich den Inhalt des Verzeichnisses überprüft /usr/lib/node_modulesund scheint das einzig Wichtige hier zu sein npm. Also habe ich den obigen Befehl bearbeitet, um alles außer zu deinstallierennpm

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

Es wurden alle Module entfernt, denen kein Präfix vorangestellt wurde @. Also habe ich die Schleife für Unterverzeichnisse erweitert.

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;

Mein /usr/lib/node_modulesenthält jetzt nur npmund verknüpfte Pakete.

siOnzee
quelle
0

Auch Sie müssen die Schleife dafür nicht ausführen.

Sie können alle node_modules mit dem einzigen Befehl löschen: -

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

Powershell-Benutzer: foreach($package in ls node_modules){npm uninstall $package}

Danke @JustMailer

Valentine Bondar
quelle
0

Piggy-backing off von Vikas Kohli und jedmao , können Sie dies tun

einzeilige Version:

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

mehrzeilige Version:

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
quelle
0

Eine weitere EINFACHE Option ist das Löschen der node_modules und der package-lock.json

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

Danach können Sie versuchen, die npm-Pakete neu zu installieren

Harter Phoujdar
quelle