À 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 install
lit package.json
pour créer une liste de dépendances et utilise package-lock.json
pour indiquer les versions de ces dépendances à installer. Si aucune dépendance n'est présente, package-lock.json
elle sera ajoutée parnpm install
.
npm ci
( du nom C ontinuous I ntégration) installe les dépendances directement à partir package-lock.json
et utilisations package.json
uniquement 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 install
d'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 ci
dans ce cas.
À utiliser npm ci
si 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
.
- Installe un package et toutes ses dépendances.
- Les dépendances sont piloté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.
- Installe 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 dans package-lock.json
pour verrouiller la version de certaines dépendances si elles ne sont pas déjà dans ce fichier.
- Nécessite au moins npm v5.7.1 .
- Nécessite
package-lock.json
ou npm-shrinkwrap.json
être présent.
- 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 à la fois.
- Il n'écrit jamais vers
package.json
ou package-lock.json
.
Algorithme
Alors que npm ci
génère l'arborescence de dépendance entière à partir de package-lock.json
ou 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
npm install
pouvoir écrire à package.json. Savez-vous ce qu'il pourrait écrire ici?npm install package
pourrait modifier les deuxpackage-lock.json
etpackage.json
, alors que lesnpm install
arguments ne modifieraient quepackage-lock.json
npm ci
supprimera tout dossier node_modules existant et s'appuiera sur lepackage-lock.json
fichier 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.la source
La documentation que vous avez liée contenait le résumé:
la source
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.json
etpackage-lock.json
fichiers .npm ci
effectue une installation propre de toutes les dépendances de votre application, maisnpm install
peut 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 vouspackage.json
souhaitez installer, c'est-à-dire que la version installée est différente de la version « requise ».D'autres différences seraient que cela
npm ci
ne touche jamais vospackage*.json
fichiers. Il arrêtera l'installation et affichera une erreur si les versions de dépendance ne correspondent pas dans les fichierspackage.json
etpackage-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 .
la source
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-gyp
est utilisée parnpm ci
.Je pense que c'est un peu d'opinion que pour avoir du
npm ci
travail, vous devez installer Python comme dépendance dans votre build.Plus d'infos ici Docker et npm - gyp ERR! pas d'accord
la source
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 install
est idéal pour le développement et dans le CI lorsque vous souhaitez mettre lenode_modules
ré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 PASnode_modules
dans une telle version) . En ce qui concerne la mise en cache, soyez prudent, si vous prévoyez de prendre en charge différentes versions deNode.js
souvenez-vous qu'ilnode_modules
faudra peut-être réinstaller en raison des différences entre lesNode.js
exigences d'exécution. Si vous souhaitez vous en tenir à une seule version, respectez la dernièreLTS
.npm ci
doit ê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 inclueznode_modules
dans une telle version) . Restez avec laLTS
version deNode.js
.Bonus: vous pouvez les mélanger en fonction de la complexité de votre création. Sur les branches de fonctionnalités,
git
vous pouvez mettre en cache lenode_modules
pour augmenter la productivité de vos équipes et sur la demande de fusion et les branches principales comptentnpm ci
pour un résultat déterministe.la source