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 install
Liest package.json
im 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.json
und verwendet package.json
nur zu bestätigen , dass es keine nicht übereinstimmen Versionen.Wenn Abhängigkeiten fehlen oder inkompatible Versionen haben, wird ein Fehler ausgegeben .
Verwenden Sie npm install
diese 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 ci
Sie 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
.
- Installiert ein Paket und alle seine Abhängigkeiten.
- Abhängigkeiten werden von
npm-shrinkwrap.json
und 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.json
oder 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.json
um die Version einiger Abhängigkeiten zu sperren, wenn sie nicht bereits in dieser Datei enthalten sind.
- Benötigt mindestens npm v5.7.1 .
- Benötigt
package-lock.json
odernpm-shrinkwrap.json
anwesend sein.
- Wirft einen Fehler aus, wenn die Abhängigkeiten von diesen beiden Dateien nicht übereinstimmen
package.json
.
- Entfernt
node_modules
und installiert alle Abhängigkeiten gleichzeitig.
- Es schreibt nie an
package.json
oder package-lock.json
.
Algorithmus
Während der npm ci
Generierung des gesamten Abhängigkeitsbaums aus package-lock.json
oder 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
npm install
auf package.json schreiben kann. Wissen Sie, was es hier schreiben könnte?npm install package
konnte beide ändernpackage-lock.json
undpackage.json
, währendnpm install
ohne Argumente nur ändern würdepackage-lock.json
npm ci
löscht alle vorhandenen node_modules-Ordner und verwendet diepackage-lock.json
Datei, 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.quelle
Die Dokumentation, die Sie verlinkt haben, hatte die Zusammenfassung:
quelle
Die Befehle sind in ihrer Funktionalität sehr ähnlich, der Unterschied besteht jedoch in der Vorgehensweise bei der Installation der in Ihren
package.json
undpackage-lock.json
Dateien angegebenen Abhängigkeiten .npm ci
führt eine Neuinstallation aller Abhängigkeiten Ihrer App durch, wobeinpm install
einige Installationen möglicherweise übersprungen werden, wenn sie bereits auf dem System vorhanden sind. Ein Problem kann auftreten, wenn die bereits auf dem Systempackage.json
installierte 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 ci
Ihrepackage*.json
Dateien niemals berührt werden. Die Installation wird gestoppt und ein Fehler angezeigt, wenn die Abhängigkeitsversionen in den Dateienpackage.json
und nicht übereinstimmenpackage-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 .
quelle
Es ist zu beachten, dass auf Light Node Docker-Bildern wie alpine kein Python installiert ist, von dem eine Abhängigkeit
node-gyp
verwendet 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
quelle
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 install
eignet sich hervorragend für die Entwicklung und im CI, wenn Sie dasnode_modules
Verzeichnis 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_modules
in einer solchen Version NICHT enthalten ) . Seien Sie beim Caching vorsichtig, wenn Sie verschiedene Versionen vonNode.js
Remember unterstützennode_modules
möchten, die aufgrund von Unterschieden zwischen denNode.js
Laufzeitanforderungen möglicherweise neu installiert werden müssen. Wenn Sie sich an eine Version halten möchten, halten Sie sich an die neuesteLTS
.npm ci
sollte 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 sienode_modules
in eine solche Version ein) . Bleib bei derLTS
Version vonNode.js
.Bonus: Sie können sie mischen, je nachdem, wie komplex Sie es machen möchten. Bei Feature-Zweigen in können
git
Sie die zwischenspeichernnode_modules
, um die Produktivität Ihres Teams zu steigern, und bei der Zusammenführungsanforderung können sich Master-Zweige aufnpm ci
ein deterministisches Ergebnis verlassen.quelle