¿Cuál es la diferencia entre "npm install" y "npm ci"?

Resuelto DiaJos asked hace 54 años • 9 respuestas

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?

DiaJos avatar Jan 01 '70 08:01 DiaJos
Aceptado

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 installlee package.jsonpara crear una lista de dependencias y usa package-lock.jsonpara informar qué versiones de estas dependencias instalar. Si una dependencia no está incluida, package-lock.jsonse 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.jsony las usa package.jsonsolo para validar que no haya versiones que no coincidan. Si falta alguna dependencia o tiene versiones incompatibles, se generará un error .

Úselo npm installpara 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 cien este caso.

Úselo npm cisi 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.jsony package-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.jsono package-lock.json.
    • Cuando se usa con un argumento ( npm i packagename), puede escribir package.jsonpara agregar o actualizar la dependencia.
    • cuando se usa sin argumentos, ( npm i) puede escribir para package-lock.jsonbloquear 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 package-lock.jsono npm-shrinkwrap.jsonestar presente.
  • Genera un error si las dependencias de estos dos archivos no coinciden package.json.
  • Elimina node_modulese instala todas las dependencias a la vez.
  • Nunca escribe a package.jsono package-lock.json.

Algoritmo

Mientras npm cigenera todo el árbol de dependencia desde package-lock.jsono 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
lucascaro avatar Nov 15 '2018 17:11 lucascaro

npm cieliminará cualquier node_modulescarpeta existente y dependerá del package-lock.jsonarchivo 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.

James Harrison avatar Sep 25 '2018 15:09 James Harrison

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 installes excelente para el desarrollo y en el CI cuando desea almacenar en caché el node_modulesdirectorio. ¿Cuándo usar esto? Puede hacer esto si está creando un paquete para que lo utilicen otras personas (NO lo incluye node_modulesen dicha versión) . Con respecto al almacenamiento en caché, tenga cuidado, si planea admitir diferentes versiones de, Node.jsrecuerde que node_moduleses posible que deba reinstalarlo debido a las diferencias entre los Node.jsrequisitos de tiempo de ejecución. Si deseas ceñirte a una versión, quédate con la última LTS.

npm cidebe 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_modulesen dicha versión) . Quédate con LTSla versión de Node.js.

npm iy npm ciambos utilizan el caché npm si existe, este caché vive normalmente en ~/.npm.

Además, npm cirespeta el package-lock.jsonexpediente. 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, gitpuede almacenar en caché las node_modulespara aumentar la productividad de su equipo y en la solicitud de fusión y las ramas maestras en las que confían npm cipara obtener un resultado determinista.

basickarl avatar May 06 '2020 06:05 basickarl