web-dev-qa-db-fra.com

Quelle est la différence entre "npm install" et "npm ci"?

Je travaille avec l'intégration continue et j'ai découvert la commande npm ci .

Je ne peux pas comprendre les avantages de l'utilisation de cette commande pour mon flux de travail.

Est-ce plus rapide? Cela rend-il le test plus difficile, d'accord, et après?

103
Webwoman

Depuis le npm docs :

En bref, les principales différences entre npm install et npm ci sont les suivantes:

  • Le projet doit avoir un package-lock.json ou un npm-shrinkwrap.json existant.
  • Si les dépendances du verrou de package ne correspondent pas à celles de package.json, npm ci se fermera avec une erreur au lieu de mettre à jour le verrou de package.
  • npm ci ne peut installer que des projets entiers à la fois: des dépendances individuelles ne peuvent pas être ajoutées avec cette commande.
  • Si un node_modules est déjà présent, il sera automatiquement supprimé avant que npm ci ne commence son installation.
  • Il n'écrira jamais dans package.json ni dans aucun des verrous de paquet: les installations sont essentiellement gelées.

Essentiellement, npm install lit _package.json_ pour créer une liste de dépendances et utilise _package-lock.json_ pour indiquer les versions de celles-ci. dépendances à installer. Si une dépendance n'est pas dans _package-lock.json_, elle sera ajoutée par _npm install_ .

npm ci (nommé d'après C ontinuous I ntegration) installe les dépendances directement à partir de _package-lock.json_ et utilise _package.json_ uniquement pour valider l'absence de versions incompatibles. Si des dépendances manquent ou ont des versions incompatibles, une erreur sera générée .

Utilisez _npm install_ pour ajouter de nouvelles dépendances et pour mettre à jour des dépendances sur un projet. Habituellement, vous l'utiliserez pendant le développement après avoir extrait les modifications qui mettent à jour la liste des dépendances, mais il peut être judicieux d'utiliser _npm ci_ dans ce cas.

Utilisez _npm ci_ si vous avez besoin d’une construction déterministe et répétable. Par exemple, lors d'une intégration continue, de travaux automatisés, etc. et lors de la première installation de dépendances, au lieu de _npm install_.

npm install

  • Installe un paquet et toutes ses dépendances.
  • Les dépendances sont gérées par _npm-shrinkwrap.json_ et _package-lock.json_ (dans cet ordre).
  • sans arguments : installe les dépendances d'un module local.
  • Peut installer des packages globaux.
  • Va installer toutes les dépendances manquantes dans _node_modules_.
  • Il peut écrire à _package.json_ ou _package-lock.json_.
    • Lorsqu'il est utilisé avec un argument (_npm i packagename_), il peut écrire dans _package.json_ pour ajouter ou mettre à jour la dépendance.
    • lorsqu'il est utilisé sans arguments, (_npm i_), il peut écrire à _package-lock.json_ pour verrouiller la version de certaines dépendances si elles ne figurent pas déjà dans ce fichier.

npm ci

  • Nécessite au moins npm v5.7.1 .
  • Nécessite la présence de _package-lock.json_ ou _npm-shrinkwrap.json_.
  • Lance une erreur si les dépendances de ces deux fichiers ne correspondent pas à _package.json_.
  • Supprime _node_modules_ et installe toutes les dépendances en même temps.
  • Il n'écrit jamais sur _package.json_ ou _package-lock.json_.

Algorithme

While _npm ci_ génère l’arborescence de dépendances complète à partir de _package-lock.json_ ou _npm-shrinkwrap.json_, _npm install_ met à jour le contenu de _node_modules_ . en utilisant l'algorithme suivant ( source ):

_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 supprimera tout dossier node_modules existant et s'appuiera sur le fichier package.lock pour installer la version spécifique de chaque paquet. Il est nettement plus rapide que l’installation de npm car certaines fonctionnalités sont ignorées. Son état propre est idéal pour les pipelines ci/cd et les dockers construits! Vous l'utilisez également pour tout installer en même temps et non pour des packages spécifiques.

11
James Harrison

La documentation que vous avez liée avait le résumé:

En bref, les principales différences entre npm install et npm ci sont les suivantes:

  • Le projet doit avoir un package-lock.json ou npm-shrinkwrap.json existant.
  • Si les dépendances dans le verrou du paquet ne correspondent pas à celles du paquet.json, npm ci se fermera avec une erreur au lieu de mettre à jour le verrou du paquet.
  • npm ci ne peut installer que des projets entiers à la fois: des dépendances individuelles ne peuvent pas être ajoutées avec cette commande.
  • Si un node_modules est déjà présent, il sera automatiquement supprimé avant que npm ci ne commence son installation.
  • Il n'écrira jamais dans package.json ni dans aucun des verrous de paquet: les installations sont essentiellement gelées.
6
OscarRyz