wake-up-neo.com

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

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 hat.

Ist es schneller Erschwert es den Test, okay, und danach?

103
Webwoman

Aus dem npm docs :

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-Datei 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. Einzelne Abhängigkeiten können mit diesem Befehl nicht 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 Paketsperren geschrieben: Installationen sind im Wesentlichen eingefroren.

Im Wesentlichen liest npm install _package.json_, um eine Liste von Abhängigkeiten zu erstellen, und verwendet _package-lock.json_, um anzugeben, welche Versionen davon vorhanden sind Abhängigkeiten zu installieren. Wenn eine Abhängigkeit nicht in _package-lock.json_ enthalten ist, wird sie durch _npm install_ hinzugefügt.

npm ci (benannt nach C ontinuous I ntegration) installiert Abhängigkeiten direkt von _package-lock.json_ und verwendet _package.json_, um nur zu überprüfen, ob keine nicht übereinstimmenden Versionen vorhanden sind. Wenn Abhängigkeiten fehlen oder inkompatible Versionen haben, wird ein Fehler ausgegeben .

Verwenden Sie _npm install_, um neue Abhängigkeiten hinzuzufügen und Abhängigkeiten in einem Projekt zu aktualisieren. Normalerweise wird es während der Entwicklung nach dem Abrufen von Änderungen verwendet, die die Liste der Abhängigkeiten aktualisieren. In diesem Fall ist es jedoch möglicherweise sinnvoll, _npm ci_ zu verwenden.

Verwenden Sie _npm ci_, wenn Sie einen deterministischen, wiederholbaren Build benötigen. Zum Beispiel bei kontinuierlicher 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.json_ und _package-lock.json_ (in dieser Reihenfolge) gesteuert.
  • ohne Argumente : Installiert Abhängigkeiten eines lokalen Moduls.
  • Kann globale Pakete installieren.
  • Installiert fehlende Abhängigkeiten in _node_modules_.
  • Es kann nach _package.json_ oder _package-lock.json_ schreiben.
    • Bei Verwendung mit einem Argument (_npm i packagename_) wird möglicherweise in _package.json_ geschrieben, um die Abhängigkeit hinzuzufügen oder zu aktualisieren.
    • bei Verwendung ohne Argumente (_npm i_) wird möglicherweise in _package-lock.json_ geschrieben, um 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 .
  • Erfordert, dass _package-lock.json_ oder _npm-shrinkwrap.json_ vorhanden ist.
  • Löst einen Fehler aus, wenn die Abhängigkeiten von diesen beiden Dateien nicht mit _package.json_ übereinstimmen.
  • Entfernt _node_modules_ und installiert alle Abhängigkeiten gleichzeitig.
  • Es wird nie in _package.json_ oder _package-lock.json_ geschrieben.

Algorithmus

Während _npm ci_ den gesamten Abhängigkeitsbaum aus _package-lock.json_ oder _npm-shrinkwrap.json_ generiert, aktualisiert _npm install_ den Inhalt von _node_modules_ mit dem folgenden Algorithmus ( Quelle ):

_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
_
169
lucascaro

npm ci löscht alle vorhandenen node_modules-Ordner und verwendet die package.lock -Datei, um die spezifische Version jedes Pakets zu installieren. Es ist bedeutend schneller als die Installation von npm, da einige Funktionen übersprungen werden. Die saubere Installation eignet sich hervorragend für CI/CD-Pipelines und Docker-Builds! Sie verwenden es auch, um alles auf einmal und nicht bestimmte Pakete zu installieren.

11
James Harrison

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-Datei 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. Einzelne Abhängigkeiten können mit diesem Befehl nicht 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 Paketsperren geschrieben: Installationen sind im Wesentlichen eingefroren.
6
OscarRyz