Befehl npm zum Deinstallieren oder Bereinigen nicht verwendeter Pakete in Node.js.

414

Gibt es eine Möglichkeit, einfach alle nicht verwendeten (nicht deklarierten) Abhängigkeiten aus einem Node.js-Projekt zu deinstallieren (solche, die in meinem nicht mehr definiert sind package.json)? Wenn ich meine Anwendung aktualisiere, möchte ich, dass die nicht referenzierten Pakete automatisch entfernt werden.

Tarion
quelle
1
Von was nicht benutzt? Wollen Sie Ordner entfernen, node_moduleswenn sie aus den jeweiligen Ordnern entfernt wurden package.json?
SLaks
1
genau, mhm npm ll gibt schon einen guten hinweis welche die kandidaten sind.
Tarion

Antworten:

670

Hinweis : Neuere npmVersionen tun dies automatisch, wenn Paketsperren aktiviert sind. Dies ist daher nur zum Entfernen von Entwicklungspaketen mit dem --productionFlag erforderlich .


Ausführen npm prune, um Module zu entfernen, die nicht in aufgeführt sind package.json.

Von npm help prune:

Dieser Befehl entfernt "fremde" Pakete. Wenn ein Paketname angegeben wird, werden nur Pakete entfernt, die mit einem der angegebenen Namen übereinstimmen.

Fremdpakete sind Pakete, die nicht in der Abhängigkeitsliste des übergeordneten Pakets aufgeführt sind.

Wenn das --productionFlag angegeben ist, entfernt dieser Befehl die in Ihren devDependencies angegebenen Pakete.

Darkhogg
quelle
3
Wenn ich das richtig lese, werden dadurch alle Unterabhängigkeiten entfernt, da sie nicht in aufgeführt sind package.json. Ist das richtig? Das nächste Update oder die nächste Installation müsste sie also neu installieren.
Nshew
1
Ja, es werden Unterabhängigkeiten entfernt. Unterabhängigkeiten werden tatsächlich im eigenen node_modulesVerzeichnis des Moduls gespeichert , sodass sie mit dem Modul entfernt werden.
Darkhogg
2
Lassen Sie mich ein Beispiel geben. Ich entferne Karma von meinem package.json, verlasse aber die Laube. Wenn ich laufe npm prune, erwarte ich, dass das gesamte Karma, einschließlich seines eigenen node_modulesOrdners mit seinen Abhängigkeiten, entfernt wird. Was ist mit den Abhängigkeiten von bower (bower-json, bower-logger, chmodr, fstream, glob, et al.). Technisch gesehen sind diese nicht in meinen Projekten aufgeführt package.json. Werden diese entfernt oder nicht?
Nshew
3
Nein sind sie nicht. Beachten Sie, dass sie nicht in Ihrem eigenen node_modules, sondern im Inneren node_modules/bower/node_modules "geschützt" sind node_modules/bower/package.json. Die Abhängigkeiten Ihres Pakets und die Abhängigkeiten Ihres Pakets werden nicht gemischt .
Darkhogg
2
und löschen Sie Ihren Shrinkwrap vor der npm-Installation, sollte in den obigen Anweisungen gewesen sein.
Andy Ray
306

Wenn Sie nicht über ein paar Minuten Zeit besorgt , dies zu tun, wäre eine Lösung sein rm -rf node_modulesund npm installwieder die lokalen Module neu zu erstellen.

Pyrce
quelle
93
Es wäre schön, wenn die Leute aufhören würden, dies ohne Kommentar herunterzustimmen. Dies ist eine gültige Strategie zum Zurücksetzen der Abhängigkeiten eines Knotenprojekts als Alternative zur akzeptierten Antwort. Wenn Sie den Inhalt eines Unterverzeichnisses von node_modules beschädigt haben (einfach mit sym-verknüpften Abhängigkeiten zu tun) oder wenn Sie zusätzliche Änderungen vorgenommen haben, wie z.
Pyrce
41
Durch die Neuerstellung wird node_modulesauch überprüft, ob die package.jsonDatei ein reproduzierbares Abhängigkeitsdiagramm beschreibt. Das Entfernen und erneute Installieren von node_modulesist im Grunde ein Bereitstellungstest.
Joemaller
2
@joemaller Nicht unbedingt haben die meisten Bereitstellungsworkflows implizit oder explizit eine Art Cache. Wenn ein Paket bereits installiert ist und der Spezifikation entspricht, wird es beibehalten. Durch Entfernen und erneutes Installieren werden die Pakete auf die neueste Version gebracht, die übereinstimmt.
Darkhogg
7
npm prunehat einem Jota nicht geholfen, aber das hat es getan. Mein Problem war ein defekter Symlink.
Eirik Birkeland
8
Unter vielen nicht idealen Umständen ist dies derzeit mit npm nicht möglich. Auch die Frage spezifizierte definitiv keine Einschränkung für wiederholtes Arbeiten oder zusätzliches Abrufen, nur wie das Endziel erreicht werden kann. Diese Antwort erfüllt die angegebene Frage, ungeachtet dessen, was andere über dieses Ziel hinaus wünschen.
Pyrce
10

Sie können npm-prune verwenden , um überflüssige Pakete zu entfernen.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

Dieser Befehl entfernt "fremde" Pakete. Wenn ein Paketname angegeben wird, werden nur Pakete entfernt, die mit einem der angegebenen Namen übereinstimmen.

Fremdpakete sind Pakete, die nicht in der Abhängigkeitsliste des übergeordneten Pakets aufgeführt sind.

Wenn das Flag --production angegeben oder die Umgebungsvariable NODE_ENV auf Produktion gesetzt ist , entfernt dieser Befehl die in Ihren devDependencies angegebenen Pakete . Wenn Sie --no-Production einstellen , wird NODE_ENV negiert, wenn die Produktion eingestellt wird .

Wenn der --dry-run verwendet wird, werden tatsächlich keine Änderungen vorgenommen.

Wenn das Flag --json verwendet wird, werden die Änderungen npm prune vorgenommen (oder mit --dry-run vorgenommen) ), als JSON-Objekt gedruckt.

Im normalen Betrieb mit aktivierten Paketsperren werden Fremdmodule automatisch entfernt, wenn Module installiert werden, und Sie benötigen diesen Befehl nur mit der --production Flag .

Wenn Sie Paketsperren deaktiviert haben, werden externe Module nicht entfernt, und es liegt an Ihnen, von Zeit zu Zeit npm prune auszuführen , um sie zu entfernen.

Verwenden Sie npm-dedupe, um die Duplizierung zu reduzieren

npm dedupe
npm ddp

Durchsucht den lokalen Paketbaum und versucht, die Gesamtstruktur zu vereinfachen, indem Abhängigkeiten weiter nach oben verschoben werden, wo sie von mehreren abhängigen Paketen effektiver gemeinsam genutzt werden können.

Betrachten Sie beispielsweise dieses Abhängigkeitsdiagramm:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

In diesem Fall, transformiert npm-dedupe den Baum in:

 a
 +-- b
 +-- d
 `-- c@1.0.10

Aufgrund der hierarchischen Natur der Modulsuche des Knotens erhalten b und d ihre Abhängigkeit vom einzelnen c-Paket auf der Stammebene des Baums.

Der Deduplizierungsalgorithmus geht den Baum entlang und verschiebt jede Abhängigkeit so weit wie möglich im Baum nach oben, auch wenn keine Duplikate gefunden werden. Dies führt sowohl zu einem flachen als auch zu einem deduplizierten Baum.

Igor Litvinovich
quelle
Ich habe MEHR Elemente in meinem Ordner node_modules, nachdem ich npm dedupe ausgeführt habe. Seufzer!
Neville