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

215

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

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

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

Webwoman
la source

Réponses:

328

À partir des documents npm :

En bref, les principales différences entre l'utilisation de npm install et npm ci sont:

  • Le projet doit avoir un package-lock.json ou 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: les 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 ou l'un des verrous de package: les installations sont essentiellement figées.

Essentiellement, npm installlit package.jsonpour créer une liste de dépendances et utilise package-lock.jsonpour indiquer les versions de ces dépendances à installer. Si aucune dépendance n'est présente, package-lock.jsonelle sera ajoutée parnpm install .

npm ci( du nom C ontinuous I ntégration) installe les dépendances directement à partir package-lock.jsonet utilisations package.jsonuniquement pour valider qu'il n'y a pas de versions incompatibles. Si des dépendances sont manquantes ou ont des versions incompatibles, cela générera une erreur .

Permet npm installd'ajouter de nouvelles dépendances et de mettre à jour des dépendances sur un projet. Habituellement, vous l'utiliseriez pendant le développement après avoir extrait les modifications qui mettent à jour la liste des dépendances, mais il peut être judicieux de l'utiliser npm cidans ce cas.

À utiliser npm cisi vous avez besoin d'une version déterministe et reproductible. Par exemple lors de l'intégration continue, des travaux automatisés, etc. et lors de l'installation des dépendances pour la première fois, au lieu de npm install.

npm install

  • Installe un package et toutes ses dépendances.
  • Les dépendances sont pilotées par npm-shrinkwrap.jsonet package-lock.json(dans cet ordre).
  • sans arguments : installe les dépendances d'un module local.
  • Peut installer des packages globaux.
  • Installe toutes les dépendances manquantes dans node_modules.
  • Il peut écrire à package.jsonou package-lock.json.
    • Lorsqu'il est utilisé avec un argument ( npm i packagename), il peut écrire dans package.jsonpour ajouter ou mettre à jour la dépendance.
    • lorsqu'il est utilisé sans arguments, ( npm i) il peut écrire dans package-lock.jsonpour verrouiller la version de certaines dépendances si elles ne sont pas déjà dans ce fichier.

npm ci

  • Nécessite au moins npm v5.7.1 .
  • Nécessite package-lock.jsonou npm-shrinkwrap.jsonêtre présent.
  • Lance une erreur si les dépendances de ces deux fichiers ne correspondent pas package.json.
  • Supprime node_moduleset installe toutes les dépendances à la fois.
  • Il n'écrit jamais vers package.jsonou package-lock.json.

Algorithme

Alors que npm cigénère l'arborescence de dépendance entière à partir de package-lock.jsonou npm-shrinkwrap.json, npm install met à jour le contenu de l'node_modules utilisation de 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
lucascaro
la source
1
Je ne savais pas npm installpouvoir écrire à package.json. Savez-vous ce qu'il pourrait écrire ici?
Veve
5
eh bien cela peut être un peu trompeur ... il écrira dans package.json lorsque vous l'utiliserez pour installer, mettre à jour ou supprimer des dépendances. Je vais clarifier cela dans le texte, merci!
lucascaro
Où cet algorithme est-il documenté? C'est à dire quelle est votre source?
Yngvar Kristiansen
1
@YngvarKristiansen c'est dans la documentation npm, a ajouté un lien vers la section spécifique pour référence
lucascaro
4
npm install packagepourrait modifier les deux package-lock.json et package.json , alors que les npm installarguments ne modifieraient quepackage-lock.json
knobo
20

npm cisupprimera tout dossier node_modules existant et s'appuiera sur le package-lock.jsonfichier pour installer la version spécifique de chaque package. Il est beaucoup plus rapide que l'installation de npm car il ignore certaines fonctionnalités. Son installation à l'état propre est idéale pour les pipelines ci / cd et les constructions de docker! Vous l'utilisez également pour installer tout en une seule fois et non des packages spécifiques.

James Harrison
la source
9

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

En bref, les principales différences entre l'utilisation de npm install et npm ci sont:

  • Le projet doit avoir un package-lock.json ou 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: les 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 ou l'un des verrous de package: les installations sont essentiellement figées.
OscarRyz
la source
2

Les commandes sont très similaires en termes de fonctionnalités, mais la différence réside dans l'approche adoptée pour installer les dépendances spécifiées dans votre package.jsonetpackage-lock.json fichiers .

npm cieffectue une installation propre de toutes les dépendances de votre application, mais npm installpeut ignorer certaines installations si elles existent déjà sur le système. Un problème peut survenir si la version déjà installée sur le système n'est pas celle que vous package.jsonsouhaitez installer, c'est-à-dire que la version installée est différente de la version « requise ».

D'autres différences seraient que cela npm cine touche jamais vos package*.jsonfichiers. Il arrêtera l'installation et affichera une erreur si les versions de dépendance ne correspondent pas dans les fichiers package.jsonet package-lock.json.

Vous pouvez lire une bien meilleure explication des documents officiels ici .

De plus, vous voudrez peut-être en savoir plus sur les verrous de package ici .

krishnakeshan
la source
1

Il convient de garder à l'esprit que les images de docker de noeud léger comme alpine n'ont pas Python installé, dont une dépendance node-gypest utilisée par npm ci.

Je pense que c'est un peu d'opinion que pour avoir du npm citravail, vous devez installer Python comme dépendance dans votre build.

Plus d'infos ici Docker et npm - gyp ERR! pas d'accord

teseo
la source
0

Alors que tout le monde a répondu aux différences techniques, aucune n'explique dans quelles situations utiliser les deux.

Vous devez les utiliser dans différentes situations.

npm installest idéal pour le développement et dans le CI lorsque vous souhaitez mettre le node_modulesrépertoire en cache . Quand l'utiliser? Vous pouvez le faire si vous créez un package pour que d'autres personnes l'utilisent (vous ne l'incluez PAS node_modulesdans une telle version) . En ce qui concerne la mise en cache, soyez prudent, si vous prévoyez de prendre en charge différentes versions de Node.jssouvenez-vous qu'il node_modulesfaudra peut-être réinstaller en raison des différences entre les Node.jsexigences d'exécution. Si vous souhaitez vous en tenir à une seule version, respectez la dernière LTS.

npm cidoit être utilisé lorsque vous devez tester et publier une application de production (un produit final, à ne pas utiliser par d'autres packages) car il est important que l'installation soit aussi déterministe que possible, cette installation prendra plus de temps mais finira par faire votre application plus fiable (vous incluez node_modulesdans une telle version) . Restez avec la LTSversion de Node.js.

Bonus: vous pouvez les mélanger en fonction de la complexité de votre création. Sur les branches de fonctionnalités, gitvous pouvez mettre en cache le node_modulespour augmenter la productivité de vos équipes et sur la demande de fusion et les branches principales comptent npm cipour un résultat déterministe.

K - La toxicité du SO augmente.
la source