Was ist der Unterschied zwischen "npm install" und "npm ci"?

214

Ich arbeite mit kontinuierlicher Integration und habe den Befehl npm ci entdeckt .

Ich kann mir nicht vorstellen, welche Vorteile die Verwendung dieses Befehls für meinen Workflow bietet.

Ist es schneller Macht es den Test schwieriger, okay und danach?

Webfrau
quelle

Antworten:

327

Aus den npm-Dokumenten :

Kurz gesagt, die Hauptunterschiede zwischen der Verwendung von npm install und npm ci sind:

  • Das Projekt muss über eine vorhandene package-lock.json oder npm-shrinkwrap.json verfügen.
  • Wenn die Abhängigkeiten in der Paketsperre nicht mit denen in package.json übereinstimmen, wird npm ci mit einem Fehler beendet, anstatt die Paketsperre zu aktualisieren.
  • npm ci kann nur ganze Projekte gleichzeitig installieren: Mit diesem Befehl können keine einzelnen Abhängigkeiten hinzugefügt werden.
  • Wenn ein node_modules bereits vorhanden ist, wird es automatisch entfernt, bevor npm ci mit der Installation beginnt.
  • Es wird niemals in package.json oder eine der Paket-Sperren geschrieben: Installationen werden im Wesentlichen eingefroren.

npm installLiest package.jsonim Wesentlichen, um eine Liste von Abhängigkeiten zu erstellen, und verwendet package-lock.json, um zu informieren, welche Versionen dieser Abhängigkeiten installiert werden sollen. Wenn eine Abhängigkeit nicht vorhanden ist package-lock.json, wird sie von hinzugefügtnpm install .

npm ci(benannt nach C ontinuierliche I ntegration) installiert Abhängigkeiten direkt aus package-lock.jsonund verwendet package.jsonnur zu bestätigen , dass es keine nicht übereinstimmen Versionen.Wenn Abhängigkeiten fehlen oder inkompatible Versionen haben, wird ein Fehler ausgegeben .

Verwenden Sie npm installdiese Option , um neue Abhängigkeiten hinzuzufügen und Abhängigkeiten zu einem Projekt zu aktualisieren. Normalerweise verwenden Sie es während der Entwicklung, nachdem Sie Änderungen vorgenommen haben, mit denen die Liste der Abhängigkeiten aktualisiert wird. Es kann jedoch eine gute Idee sein, es zu verwendennpm ci wird. In diesem Fall ist .

Verwenden npm ciSie diese Option, wenn Sie einen deterministischen, wiederholbaren Build benötigen. Zum Beispiel während der kontinuierlichen Integration, automatisierten Jobs usw. und bei der erstmaligen Installation von Abhängigkeiten anstelle von npm install.

npm install

  • Installiert ein Paket und alle seine Abhängigkeiten.
  • Abhängigkeiten werden von npm-shrinkwrap.jsonund gesteuertpackage-lock.json (in dieser Reihenfolge) .
  • ohne Argumente : Installiert Abhängigkeiten eines lokalen Moduls.
  • Kann globale Pakete installieren.
  • Installiert fehlende Abhängigkeiten in node_modules .
  • Es kann an package.jsonoder schreibenpackage-lock.json .
    • Bei Verwendung mit einem Argument ( npm i packagename) kann es schreibenpackage.json , um die Abhängigkeit hinzuzufügen oder zu aktualisieren.
    • Bei Verwendung ohne Argumente kann ( npm i) geschrieben werden, package-lock.jsonum die Version einiger Abhängigkeiten zu sperren, wenn sie nicht bereits in dieser Datei enthalten sind.

npm ci

  • Benötigt mindestens npm v5.7.1 .
  • Benötigt package-lock.jsonodernpm-shrinkwrap.json anwesend sein.
  • Wirft einen Fehler aus, wenn die Abhängigkeiten von diesen beiden Dateien nicht übereinstimmen package.json .
  • Entfernt node_modulesund installiert alle Abhängigkeiten gleichzeitig.
  • Es schreibt nie an package.jsonoder package-lock.json.

Algorithmus

Während der npm ciGenerierung des gesamten Abhängigkeitsbaums aus package-lock.jsonoder npm-shrinkwrap.json, wird npm install der Inhalt dernode_modules Verwendung des folgenden Algorithmus ( Quelle ) aktualisiert :

load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move
lucascaro
quelle
1
Ich wusste nicht, dass ich npm installauf package.json schreiben kann. Wissen Sie, was es hier schreiben könnte?
Veve
5
Nun, das könnte etwas irreführend sein ... es wird in package.json geschrieben, wenn Sie es zum Installieren, Aktualisieren oder Entfernen von Abhängigkeiten verwenden. Ich werde das im Text klarer machen, danke!
Lucascaro
Wo ist dieser Algorithmus dokumentiert? Dh was ist deine Quelle?
Yngvar Kristiansen
1
@YngvarKristiansen es ist in der npm Dokumentation, fügte einen Link zu dem spezifischen Abschnitt als Referenz hinzu
Lucascaro
4
npm install packagekonnte beide ändern package-lock.json und package.json , während npm installohne Argumente nur ändern würdepackage-lock.json
Knobo
20

npm cilöscht alle vorhandenen node_modules-Ordner und verwendet die package-lock.jsonDatei, um die spezifische Version jedes Pakets zu installieren. Es ist erheblich schneller als die Installation von npm, da einige Funktionen übersprungen werden. Die Installation im sauberen Zustand eignet sich hervorragend für CD / CD-Pipelines und Docker-Builds! Sie können damit auch alles auf einmal installieren und keine bestimmten Pakete.

James Harrison
quelle
9

Die Dokumentation, die Sie verlinkt haben, hatte die Zusammenfassung:

Kurz gesagt, die Hauptunterschiede zwischen der Verwendung von npm install und npm ci sind:

  • Das Projekt muss über eine vorhandene package-lock.json oder npm-shrinkwrap.json verfügen.
  • Wenn die Abhängigkeiten in der Paketsperre nicht mit denen in package.json übereinstimmen, wird npm ci mit einem Fehler beendet, anstatt die Paketsperre zu aktualisieren.
  • npm ci kann nur ganze Projekte gleichzeitig installieren: Mit diesem Befehl können keine einzelnen Abhängigkeiten hinzugefügt werden.
  • Wenn ein node_modules bereits vorhanden ist, wird es automatisch entfernt, bevor npm ci mit der Installation beginnt.
  • Es wird niemals in package.json oder eine der Paket-Sperren geschrieben: Installationen werden im Wesentlichen eingefroren.
OscarRyz
quelle
2

Die Befehle sind in ihrer Funktionalität sehr ähnlich, der Unterschied besteht jedoch in der Vorgehensweise bei der Installation der in Ihren package.jsonund package-lock.jsonDateien angegebenen Abhängigkeiten .

npm ciführt eine Neuinstallation aller Abhängigkeiten Ihrer App durch, wobei npm installeinige Installationen möglicherweise übersprungen werden, wenn sie bereits auf dem System vorhanden sind. Ein Problem kann auftreten, wenn die bereits auf dem System package.jsoninstallierte Version nicht diejenige ist, die Sie installieren möchten, dh die installierte Version unterscheidet sich von der erforderlichen Version.

Andere Unterschiede wären, dass npm ciIhre package*.jsonDateien niemals berührt werden. Die Installation wird gestoppt und ein Fehler angezeigt, wenn die Abhängigkeitsversionen in den Dateien package.jsonund nicht übereinstimmen package-lock.json.

Eine viel bessere Erklärung können Sie den offiziellen Dokumenten hier entnehmen .

Darüber hinaus können Sie über Paketsperren lesen hier .

krishnakeshan
quelle
1

Es ist zu beachten, dass auf Light Node Docker-Bildern wie alpine kein Python installiert ist, von dem eine Abhängigkeit node-gypverwendet wirdnpm ci .

Ich denke, es ist ein bisschen eigensinnig, das zu haben npm ci Sie Python als Abhängigkeit in Ihrem Build installieren müssen, um arbeiten zu können.

Mehr Infos hier Docker und npm - gyp ERR! nicht ok

teseo
quelle
0

Während alle anderen auf die technischen Unterschiede geantwortet haben, erklärt keiner, in welchen Situationen beide zu verwenden sind.

Sie sollten sie in verschiedenen Situationen verwenden.

npm installeignet sich hervorragend für die Entwicklung und im CI, wenn Sie das node_modulesVerzeichnis zwischenspeichern möchten . Wann soll man das benutzen? Sie können dies tun, wenn Sie ein Paket erstellen, das von anderen Personen verwendet werden kann ( node_modulesin einer solchen Version NICHT enthalten ) . Seien Sie beim Caching vorsichtig, wenn Sie verschiedene Versionen von Node.jsRemember unterstützen node_modulesmöchten, die aufgrund von Unterschieden zwischen den Node.jsLaufzeitanforderungen möglicherweise neu installiert werden müssen. Wenn Sie sich an eine Version halten möchten, halten Sie sich an die neueste LTS.

npm cisollte verwendet werden, wenn Sie eine Produktionsanwendung testen und freigeben möchten (ein Endprodukt, das nicht von anderen Paketen verwendet werden soll), da es wichtig ist, dass die Installation so deterministisch wie möglich ist. Diese Installation dauert länger, dauert aber letztendlich Ihre Anwendung ist zuverlässiger (Sie schließen sie node_modulesin eine solche Version ein) . Bleib bei der LTSVersion von Node.js.

Bonus: Sie können sie mischen, je nachdem, wie komplex Sie es machen möchten. Bei Feature-Zweigen in können gitSie die zwischenspeichern node_modules, um die Produktivität Ihres Teams zu steigern, und bei der Zusammenführungsanforderung können sich Master-Zweige auf npm ciein deterministisches Ergebnis verlassen.

K - Die Toxizität in SO nimmt zu.
quelle