2016-10-01 1 views
1

Das Dependency Management-System von Gradle speichert heruntergeladene Artefakte in einem lokalen Maven-Cache. Wenn ein Build erneut dieselbe Abhängigkeit anfordert, wird die Abhängigkeit einfach aus dem Cache abgerufen, wodurch jegliche Netzwerkübertragung des Artefakts vermieden wird.NPM-Caching ähnlich einem lokalen Maven-Cache

Ich versuche, dieses Verhalten mit NPM zum Erstellen von JavaScript-Projekten zu replizieren. Ich habe erwartet, dass NPM einen globalen node_modules-Cache unterstützt, aber die Installation eines Pakets "global" in NPM hat eine andere Bedeutung => das Paket wird zu PATH hinzugefügt, so dass es als CLI-Tool verwendet werden kann.

die Dokumenation für npm install Lesen, ist das Standardverhalten von Paketen in einem lokalen node_modules Verzeichnis zu installieren. Dies würde jedoch bedeuten, dass viele doppelte Pakete auf dem System wertvollen Speicherplatz verschwenden würden. Es stellt auch ein Problem dar, saubere Produktionsaufbauten zu machen, da idealerweise die Knotenmodule jedes Mal weggeblasen werden sollten.

Unterstützt NPM so etwas wie das Maven-Caching der Gradle? Die Dokumentation auf NPM cache macht es nicht klarer, wie dies zu verwenden ist. Darüber hinaus ist es nicht offensichtlich, ob eine Caching-Strategie mit NPM über mehrere parallele Builds sicher ist.

Dies scheint eine Grundvoraussetzung für vielbeschäftigte CI-Umgebungen zu sein, die zuvor gelöst sein muss. Ich fand das npm-cache Tool, das diese Unterstützung zu bieten scheint, aber es wäre viel besser, wenn Caching nativ in npm selbst unterstützt wurde.

Danke!

Antwort

1

NPM-Cache bereits comes bundled with NPM out of the box (aufgeführt unter CLI-Befehle). Und sein Hauptnutzen besteht darin, die Netzwerkübertragung des gleichen Pakets immer wieder zu vermeiden.

In Bezug auf die doppelte Pakete Ausgabe, wie von npm v3 gab es an effort in terms of finding ways to deduplicate dependencies. Aber es funktioniert immer noch nicht genau wie Gradle, da es immer noch möglich ist, mit Duplikaten desselben Pakets in Ihrem Ordner node_modules zu enden.

Per NPM documentation:

Ihre node_modules Verzeichnisstruktur und damit Ihr Abhängigkeitsbaum ist abhängig von installieren, um

Obwohl eine frischen npm install aus dem gleichen Paket json immer den gleichen Abhängigkeitsbaum:

Der Befehl npm install, wenn ausschließlich zur Installation des Pakets verwendet Alter von apackage.json, wird immer den gleichen Baum produzieren. Dies liegt daran, dass die Installationsreihenfolge von einer package.json immer alphabetisch ist. Die gleiche Installationsreihenfolge bedeutet, dass Sie den gleichen Baum erhalten.

So gibt es zumindest einen Weg, konsistente Abhängigkeitsbäume zu bekommen, obwohl es keine Garantie gibt, dass es die effizienteste sein wird. Zumindest diese Unterschiede do not interfere correct functioning of NPM.

Hoffe, dass hilft.

+0

Es ist genau das Verhalten des Caches, die ich zu verstehen versuchen. Bei einer Neuinstallation auf meinem Computer wird beispielsweise ein Verzeichnis "node_modules" mit einer Größe von ~ 3 GB erstellt, das Cache-Verzeichnis ".npm" jedoch nur ~ 120 MB. Also, was ist hier los? Ist NPM nicht alles im Cache? Ich kann dieses Verhalten nirgendwo dokumentiert oder erklärt finden – Boon

+0

Obwohl NPM versucht, die Abhängigkeiten zu deduplizieren, garantiert es keine vollständige Deduplizierung. Durch seine rekursive Art können Sie also in Ihrer Abhängigkeitsbaumstruktur weitere Kopien desselben Pakets erhalten. Und deshalb enden Sie mit einem größeren 'node_modules'-Ordner als Ihr Cache. – fmello

+0

Nachdem ich das gesagt habe, stimme ich zu, dass ein 120MB bis 3GB Sprung groß erscheint. Können Sie bestätigen, ob Ihre npm-Version 3+ ist? Ich bin von meinem Dev env übers Wochenende weg. Aber wenn Sie ein Beispiel Ihrer 'package.json' veröffentlichen, würde ich froh sein, eine Beispielinstallation für Sie zu führen und Ergebnisse zu vergleichen – fmello

0

IMHO ist es schade, dass die Macher nicht von Dingen wie Maven gelernt haben, die schon da waren.Wenn Sie Microservices betreiben und viele Anwendungen auf Ihrem Rechner haben und Sie möglicherweise mehrere Zweige oder lokale jenkins haben, haben Sie jede Abhängigkeit N * M mal auf der Festplatte, was eine außergewöhnliche Verschwendung von Speicherplatz und Leistung darstellt. Sie müssen sich also bewusst sein, dass Java oder .NET/C# ausgereifte Ökosysteme sind, während das JavaScript-Ökosystem noch in der Kindheit mit vielen Fehlern und Kanten ist. Aber JavaScript entwickelt sich schnell und lässt auf das Beste hoffen. Fühlen Sie sich frei, Ihre Schmerzen mit den NPM-Herstellern (https://github.com/npm/npm/issues/) zu diskutieren.

jedoch eine partielle Heilung kommt, wenn Sie von NPM und wechseln Sie zu Garn weggehe http://yarnpkg.com/

Verwandte Themen