npm continuous-integration npm-install npm-ci

¿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 y package-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 o package-lock.json .
    • Cuando se usa con un argumento ( npm i packagename ) puede escribir en package.json para agregar o actualizar la dependencia.
    • cuando se usa sin argumentos, ( npm i ) puede escribir en package-lock.json para bloquear la versión de algunas dependencias si aún no están en este archivo.

npm ci

  • Requiere al menos npm v5.7.1 .
  • Requiere que package-lock.json o npm-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 o package-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.