¿Cuál es la diferencia entre “npm install” y “npm ci”?
continuous-integration npm-install (3)
En resumen:
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á en
package-lock.json
,
npm install
.
npm ci
(el nombre de
C
ontinuous
I
ntegration) instala las dependencias directamente desde
package-lock.json
y usa
package.json
solo para validar que no hay versiones que no coincidan.
Si falta alguna dependencia o tiene versiones incompatibles, se generará un error
.
Use
npm install
para agregar nuevas dependencias y actualizar dependencias en un proyecto.
Por lo general, lo usaría durante el desarrollo después de extraer los cambios que actualizan la lista de dependencias, pero puede ser una buena idea usar
npm ci
en este caso.
Use
npm ci
si necesita una construcció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 son controladas por
npm-shrinkwrap.json
ypackage-lock.json
(en ese orden). - Sin argumentos : instala dependencias de un módulo local.
- Puede instalar paquetes globales.
-
Instalaré las dependencias faltantes en
node_modules
. -
Puede escribir en
package.json
opackage-lock.json
.-
Cuando se usa con un argumento (
npm i packagename
) puede escribir enpackage.json
para agregar o actualizar la dependencia. -
cuando se usa sin argumentos, (
npm i
) puede escribir enpackage-lock.json
para 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 que
package-lock.json
onpm-shrinkwrap.json
esté presente. -
Emite un error si las dependencias de estos dos archivos no coinciden con
package.json
. -
Elimina
node_modules
e instala todas las dependencias a la vez. -
Nunca escribe en
package.json
opackage-lock.json
.
Algoritmo
Mientras
npm ci
genera todo el árbol de dependencias desde
package-lock.json
o
npm-shrinkwrap.json
,
npm install
actualiza el contenido de
node_modules
utilizando el siguiente algoritmo (
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
Estoy trabajando con la 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 la prueba más difícil, está bien, y después?
La documentación que vinculó tenía el resumen:
En resumen, las principales diferencias entre el uso de npm install y npm ci son:
- El proyecto debe tener un package-lock.json existente o npm-shrinkwrap.json.
- Si las dependencias en el bloqueo del paquete no coinciden con las de package.json, npm ci se cerrará 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.
Npm ci eliminará cualquier carpeta existente de node_modules y se basará en el archivo package.lock 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 características. ¡La instalación en estado limpio es excelente para las tuberías ci / cd y las compilaciones de la ventana acoplable! También lo usa para instalar todo de una vez y no paquetes específicos.