Antworten:
Die Antwort ist nicht so einfach, wie Alberto Zaccagni vorschlägt. Wenn Sie Anwendungen (insbesondere Unternehmensanwendungen) entwickeln, ist es eine gute Wahl, node_modules in Ihr Git-Repo aufzunehmen, und welche Alternative Sie wählen, hängt von Ihrem Projekt ab.
Da er sehr gut gegen node_modules argumentiert hat, werde ich mich auf Argumente für sie konzentrieren.
Stellen Sie sich vor, Sie haben gerade die Unternehmens-App fertiggestellt und müssen sie 3-5 Jahre lang unterstützen. Sie möchten definitiv nicht auf das npm-Modul von jemandem angewiesen sein, das morgen verschwinden kann, und Sie können Ihre App nicht mehr aktualisieren.
Oder Sie haben Ihre privaten Module, die nicht über das Internet zugänglich sind, und Sie können Ihre App nicht im Internet erstellen. Oder vielleicht möchten Sie sich aus bestimmten Gründen nicht auf Ihren endgültigen Aufbau des npm-Dienstes verlassen.
In diesem Artikel von Addy Osmani finden Sie Vor- und Nachteile (obwohl es sich um Bower handelt, ist es fast die gleiche Situation). Und ich werde mit einem Zitat von der Bower-Homepage und Addys Artikel enden:
"Wenn Sie kein Paket erstellen, das von anderen verwendet werden soll (z. B. wenn Sie eine Web-App erstellen), sollten Sie installierte Pakete immer in der Quellcodeverwaltung einchecken."
git checkout foo
. Wenn sich node_modules nicht unter VCS befinden - Zweig wechseln ist git checkout foo ; npm install
und was auch immer Ihre aktuelle NPM-Version benötigt, um zu funktionieren;)
Moduldetails werden gespeichert packages.json
, das reicht. Sie müssen nicht einchecken node_modules
.
Früher wurde node_modules
in der Versionskontrolle gespeichert , um Abhängigkeiten von Modulen zu sperren, aber mit npm Shrinkwrap wird dies nicht mehr benötigt.
Eine weitere Rechtfertigung für diesen Punkt, wie @ChrisCM im Kommentar schrieb:
Erwähnenswert ist auch, dass Module mit nativen Erweiterungen nicht von Architektur zu Architektur funktionieren und neu erstellt werden müssen. Bereitstellung einer konkreten Begründung für die NICHTaufnahme in das Repo.
Ich würde empfehlen, node_modules nicht einzuchecken, da beispielsweise Pakete wie PhantomJS und node-sass die entsprechende Binärdatei für das aktuelle System installieren.
Dies bedeutet, dass wenn ein npm install
Entwickler unter Linux läuft und node_modules eincheckt, dies nicht für einen anderen Entwickler funktioniert, der das Repo unter Windows klont.
Es ist besser, die Tarballs einzuchecken, auf denen npm Downloads installiert, und npm-shrinkwrap.json
auf sie zu zeigen. Sie können diesen Prozess mit shrinkpack automatisieren .
npm install --global shrinkpack
selbst nicht die verzögerte Schwäche, andere Pakete zu benötigen, mit denen die geschrumpften Pakete installiert werden sollen? Dies widerspricht Addys Rat.
shrinkpack
Nach Ihren Angaben ist eine Abhängigkeit von erforderlich, um Build-Abhängigkeiten zuverlässig zu installieren. Daher wird die Installation des Build-Tools selbst zur Schwachstelle des Arguments, alle Build-Abhängigkeiten der Versionskontrolle zu unterwerfen.
Ich verstehe, dieses Thema ist ziemlich alt. Aufgrund der veränderten Situation im Ökosystem von npm fehlt mir jedoch eine Aktualisierung der hier angegebenen Argumente.
Ich würde immer raten, node_modules nicht unter Versionskontrolle zu stellen. Fast alle Vorteile, die im Zusammenhang mit der akzeptierten Antwort aufgeführt sind, sind derzeit ziemlich veraltet.
Veröffentlichte Pakete können nicht mehr so einfach aus der npm-Registrierung widerrufen werden. Sie müssen also nicht befürchten, Abhängigkeiten zu verlieren, auf die sich Ihr Projekt zuvor verlassen hat.
Das Einfügen der Datei package-json.lock in VCS hilft bei häufig aktualisierten Abhängigkeiten, die wahrscheinlich zu unterschiedlichen Setups führen, obwohl dieselbe Datei package.json verwendet wird.
Das Einfügen von node_modules in VCS im Falle von Offline-Build-Tools kann daher als der einzige verbleibende Anwendungsfall angesehen werden. Node_modules wächst jedoch normalerweise ziemlich schnell. Jedes Update ändert viele Dateien. Dies wirkt sich auf Repositories auf unterschiedliche Weise aus. Wenn Sie wirklich langfristige Auswirkungen in Betracht ziehen, kann dies ebenfalls ein Hindernis sein.
Zentralisierte VCS wie svn erfordern das Übertragen festgeschriebener und ausgecheckter Dateien über das Netzwerk, was beim Auschecken oder Aktualisieren eines Ordners node_modules höllisch langsam sein wird.
Wenn es um Git geht, verschmutzt diese hohe Anzahl zusätzlicher Dateien sofort das Repository. Beachten Sie, dass git keine Unterschiede zwischen den Versionen einer Datei verfolgt, sondern Kopien beider Versionen einer Datei speichert, sobald sich ein einzelnes Zeichen geändert hat. Jedes Update einer Abhängigkeit führt zu einem weiteren großen Änderungssatz. Ihr Git-Repository wird schnell riesig, da dies Auswirkungen auf Backups und Remote-Synchronisation hat. Wenn Sie sich entscheiden, node_modules später aus dem Git-Repository zu entfernen, ist es aus historischen Gründen immer noch Teil davon. Wenn Sie Ihr Git-Repository auf einen Remote-Server verteilt haben (z. B. zur Sicherung), ist die Bereinigung eine weitere schmerzhafte und fehleranfällige Aufgabe, auf die Sie stoßen würden.
Wenn Sie also auf effiziente Prozesse Wert legen und die Dinge "klein" halten möchten, verwende ich lieber ein separates Artefakt-Repository wie das Nexos-Repository (oder nur einen HTTP-Server mit ZIP-Archiven), das einige zuvor abgerufene Abhängigkeiten zum Herunterladen bereitstellt.
Nicht node_modules
mit der Quellcodeverwaltung zu verfolgen ist die richtige Wahl, da einige NodeJS-Module, wie der MongoDB NodeJS-Treiber, NodeJS C ++ - Add-Ons verwenden. Diese Add-Ons werden beim Ausführen des npm install
Befehls kompiliert . Wenn Sie also das node_modules
Verzeichnis verfolgen , können Sie versehentlich eine betriebssystemspezifische Binärdatei festschreiben.
Ich stimme ivoszz zu, dass es manchmal nützlich ist , den Ordner node_modules zu überprüfen, aber ...
Szenario 1:
Ein Szenario: Sie verwenden ein Paket, das aus npm entfernt wird. Wenn Sie alle Module im Ordner node_modules haben, ist dies für Sie kein Problem. Wenn Sie nur den Paketnamen in der Datei package.json haben, können Sie ihn nicht mehr erhalten. Wenn ein Paket weniger als 24 Stunden alt ist, können Sie es problemlos aus npm entfernen. Wenn es älter als 24 Stunden ist, müssen Sie sie kontaktieren. Aber:
Wenn Sie sich an den Support wenden, wird geprüft, ob durch das Entfernen dieser Version Ihres Pakets andere Installationen beschädigt werden. Wenn ja, werden wir es nicht entfernen.
Die Chancen dafür sind also gering, aber es gibt Szenario 2 ...
Szenario 2:
Ein anderes Szenario, in dem dies der Fall ist: Sie entwickeln eine Unternehmensversion Ihrer Software oder eine sehr wichtige Software und schreiben in Ihr package.json:
"dependencies": {
"studpid-package": "~1.0.1"
}
Sie verwenden die Methode function1(x)
dieses Pakets.
Jetzt benennen die Entwickler von studpid-package die Methode function1(x)
in um function2(x)
und machen einen Fehler ... Sie ändern die Version ihres Pakets von 1.0.1
auf 1.1.0
. Das ist ein Problem, denn wenn Sie npm install
das nächste Mal aufrufen , akzeptieren Sie die Version, 1.1.0
weil Sie die Tilde verwendet haben ("studpid-package": "~1.0.1"
) verwendet haben.
Das Anrufen function1(x)
kann jetzt Fehler und Probleme verursachen.
Aber:
Das Verschieben des gesamten Ordners node_modules (häufig mehr als 100 MB) in Ihr Repository kostet Speicherplatz. Ein paar KB (nur package.json) im Vergleich zu Hunderten von MB (package.json & node_modules) ... Denken Sie darüber nach.
Sie könnten es tun / sollten darüber nachdenken, wenn:
Die Software ist sehr wichtig.
Es kostet Sie Geld, wenn etwas ausfällt.
Sie vertrauen der npm-Registrierung nicht. npm ist zentralisiert und könnte theoretisch heruntergefahren werden.
Sie brauchen nicht , wenn die node_modules Ordner in 99,9% der Fälle zu veröffentlichen:
Sie entwickeln eine Software nur für sich.
Sie haben etwas programmiert und möchten das Ergebnis nur auf GitHub veröffentlichen, weil sich möglicherweise jemand anderes dafür interessiert.
Wenn Sie nicht möchten, dass sich die node_modules in Ihrem Repository befinden, erstellen Sie einfach eine .gitignore
Datei und fügen Sie die Zeile hinzu node_modules
.
npm install
Windows und MacOS aufrufen, können in einigen Paketen unterschiedliche Dateien ( betriebssystemabhängige Dateien) generiert werden. Aber da bin ich mir nicht sicher. Kann jemand überprüfen, ob dies wahr ist?
package-lock.json
. Wenn es in Zukunft ein Problem mit einem Update des studpid-Pakets gibt, können Sie die Sperrdatei zurücksetzen, um die genaue Version herauszufinden, die für Sie funktioniert hat.
Ich möchte eine Alternative mitten auf der Straße anbieten.
node_modules
in git .package-lock.json
Datei, um Ihre Abhängigkeitsversionen festzulegen.In dem seltenen Fall, dass Sie nicht auf NPM (oder andere von Ihnen verwendete Register) oder ein bestimmtes Paket in NPM zugreifen können, verfügen Sie über eine Kopie von node_modules und können weiterarbeiten, bis Sie den Zugriff wiederherstellen.
Noch etwas zu beachten: Das Einchecken node_modules
macht es schwieriger / unmöglich, den Unterschied zwischen dependencies
und zu nutzen devDependencies
.
Auf der anderen Seite könnte man sagen, dass es beruhigend ist, genau den gleichen Code in die Produktion zu bringen, der die Tests durchlaufen hat - also auch devDependencies
.
node_modules muss nicht eingecheckt werden, wenn Abhängigkeiten in package.json erwähnt werden. Jeder andere Programmierer kann es einfach durch die Installation von npm erhalten, und die npm ist intelligent genug, um die node_modules in Ihrem Arbeitsverzeichnis für das Projekt zu erstellen.