Réponses:
À 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
.
npm install
npm-shrinkwrap.json
et package-lock.json
(dans cet ordre).node_modules
.package.json
ou package-lock.json
.
npm i packagename
), il peut écrire dans package.json
pour ajouter ou mettre à jour la dépendance.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.npm ci
package-lock.json
ou npm-shrinkwrap.json
être présent.package.json
.node_modules
et installe toutes les dépendances à la fois.package.json
ou package-lock.json
.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 package
pourrait modifier les deux package-lock.json
et package.json
, alors que les npm install
arguments ne modifieraient quepackage-lock.json
npm ci
supprimera tout dossier node_modules existant et s'appuiera sur le package-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 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.
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, mais npm 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 vous package.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 vos package*.json
fichiers. Il arrêtera l'installation et affichera une erreur si les versions de dépendance ne correspondent pas dans les fichiers package.json
et 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 .
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 par npm 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
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 le node_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 PAS node_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 de Node.js
souvenez-vous qu'il node_modules
faudra peut-être réinstaller en raison des différences entre les Node.js
exigences d'exécution. Si vous souhaitez vous en tenir à une seule version, respectez la dernière LTS
.
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 incluez node_modules
dans une telle version) . Restez avec la LTS
version de Node.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 le node_modules
pour augmenter la productivité de vos équipes et sur la demande de fusion et les branches principales comptent npm ci
pour un résultat déterministe.
npm install
pouvoir écrire à package.json. Savez-vous ce qu'il pourrait écrire ici?