¿Cuál es la diferencia entre "npm install" y "npm ci"?
Estoy trabajando con integración continua y descubrí el comando npm ci .
No puedo entender cuáles son las ventajas de usar este comando para mi flujo de trabajo.
¿Es más rápido? ¿Hace que la prueba sea más difícil, vale y después?
De la documentación oficial de npm ci :
En resumen, las principales diferencias entre usar npm install y npm ci son:
- El proyecto debe tener un package-lock.json o npm-shrinkwrap.json existente.
- Si las dependencias en el bloqueo del paquete no coinciden con las de package.json, npm ci saldrá con un error, en lugar de actualizar el bloqueo del paquete.
- npm ci solo puede instalar proyectos completos a la vez: no se pueden agregar dependencias individuales con este comando.
- Si ya hay un node_modules presente, se eliminará automáticamente antes de que npm ci comience su instalación.
- Nunca escribirá en package.json ni en ninguno de los bloqueos de paquetes: las instalaciones están esencialmente congeladas.
Básicamente,
npm install
lee package.json
para crear una lista de dependencias y usa package-lock.json
para informar qué versiones de estas dependencias instalar. Si una dependencia no está incluida, package-lock.json
se agregará mediantenpm install
.
npm ci
(también conocido como instalación limpia ) está diseñado para usarse en entornos automatizados , como plataformas de prueba, integración continua e implementación, o cualquier situación en la que desee asegurarse de realizar una instalación limpia de sus dependencias.
Instala dependencias directamente package-lock.json
y las usa package.json
solo para validar que no haya versiones que no coincidan. Si falta alguna dependencia o tiene versiones incompatibles, se generará un error .
Úselo npm install
para agregar nuevas dependencias y actualizar dependencias en un proyecto. Por lo general, lo usaría durante el desarrollo después de realizar cambios que actualicen la lista de dependencias, pero puede ser una buena idea usarlo npm ci
en este caso.
Úselo npm ci
si necesita una compilación determinista y repetible. Por ejemplo, durante la integración continua, trabajos automatizados, etc. y al instalar dependencias por primera vez, en lugar de npm install
.
npm install
- Instala un paquete y todas sus dependencias.
- Las dependencias están impulsadas por
npm-shrinkwrap.json
ypackage-lock.json
(en ese orden). - sin argumentos : instala dependencias de un módulo local.
- Puede instalar paquetes globales.
- Instalará cualquier dependencia que falte en
node_modules
. - Puede escribir a
package.json
opackage-lock.json
.- Cuando se usa con un argumento (
npm i packagename
), puede escribirpackage.json
para agregar o actualizar la dependencia. - cuando se usa sin argumentos, (
npm i
) puede escribir parapackage-lock.json
bloquear la versión de algunas dependencias si aún no están en este archivo.
- Cuando se usa con un argumento (
npm ci
- Requiere al menos npm v5.7.1 .
- Requiere
package-lock.json
onpm-shrinkwrap.json
estar presente. - Genera un error si las dependencias de estos dos archivos no coinciden
package.json
. - Elimina
node_modules
e instala todas las dependencias a la vez. - Nunca escribe a
package.json
opackage-lock.json
.
Algoritmo
Mientras npm ci
genera todo el árbol de dependencia desde package-lock.json
o npm-shrinkwrap.json
, npm install
actualiza el contenidonode_modules
utilizando el siguiente algoritmo ( fuente ):
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 ci
eliminará cualquier node_modules
carpeta existente y dependerá del package-lock.json
archivo para instalar la versión específica de cada paquete. Es significativamente más rápido que la instalación de npm porque omite algunas funciones. ¡Su instalación en estado limpio es ideal para canalizaciones ci/cd y compilaciones de Docker! También lo usas para instalar todo de una vez y no paquetes específicos.
Si bien todos los demás han respondido las diferencias técnicas, ninguno explica en qué situaciones usar ambos.
Debes usarlos en diferentes situaciones.
npm install
es excelente para el desarrollo y en el CI cuando desea almacenar en caché el node_modules
directorio. ¿Cuándo usar esto? Puede hacer esto si está creando un paquete para que lo utilicen otras personas (NO lo incluye node_modules
en dicha versión) . Con respecto al almacenamiento en caché, tenga cuidado, si planea admitir diferentes versiones de, Node.js
recuerde que node_modules
es posible que deba reinstalarlo debido a las diferencias entre los Node.js
requisitos de tiempo de ejecución. Si deseas ceñirte a una versión, quédate con la última LTS
.
npm ci
debe usarse cuando vaya a probar y lanzar una aplicación de producción (un producto final, que no debe ser utilizado por otros paquetes), ya que es importante que la instalación sea lo más determinista posible, esta instalación llevará más tiempo pero finalmente facilitará la ejecución. su aplicación sea más confiable (la incluye node_modules
en dicha versión) . Quédate con LTS
la versión de Node.js
.
npm i
y npm ci
ambos utilizan el caché npm si existe, este caché vive normalmente en ~/.npm
.
Además, npm ci
respeta el package-lock.json
expediente. A diferencia de npm install
, que reescribe el archivo y siempre instala nuevas versiones.
Bonificación: puedes mezclarlos dependiendo de qué tan complejo quieras hacerlo. En las ramas de funciones, git
puede almacenar en caché las node_modules
para aumentar la productividad de su equipo y en la solicitud de fusión y las ramas maestras en las que confían npm ci
para obtener un resultado determinista.