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

215

Estoy trabajando con una 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?

Webwoman
fuente

Respuestas:

328

De los documentos npm :

En resumen, las principales diferencias entre usar npm install y npm ci son:

  • El proyecto debe tener un paquete existente-lock.json o npm-shrinkwrap.json.
  • Si las dependencias en el bloqueo del paquete no coinciden con las del paquete.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: las dependencias individuales no se pueden agregar con este comando.
  • Si un node_modules ya está 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.

Esencialmente, se npm installlee package.jsonpara crear una lista de dependencias y se usa package-lock.jsonpara informar qué versiones de estas dependencias instalar. Si no hay una dependencia package-lock.json, será agregada pornpm install .

npm ci(el nombre de C ontinuous I NTEGRACIÓN) instala dependencias directamente desde package-lock.jsony usos package.jsonsólo para validar que no hay versiones no coincidentes. Si falta alguna dependencia o tiene versiones incompatibles, arrojará un error .

Se usa npm installpara agregar nuevas dependencias y para 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 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 conducidas 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.
  • Lanza 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 dependencias desde package-lock.jsono npm-shrinkwrap.json, npm install actualiza el contenido delnode_modules uso del 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
fuente
1
No sabía que npm installpodía escribir en package.json. ¿Sabes lo que podría escribir aquí?
Veve
55
bueno, eso puede ser un poco engañoso ... escribirá en package.json cuando lo use para instalar, actualizar o eliminar dependencias. Lo aclararé más en el texto, ¡gracias!
lucascaro
¿Dónde se documenta este algoritmo? ¿Cuál es tu fuente?
Yngvar Kristiansen
1
@YngvarKristiansen está en la documentación de npm, agregó un enlace a la sección específica para referencia
lucascaro
44
npm install packagepodría modificar tanto package-lock.json y package.json , mientras npm installargumentos whithout sólo se modificaríanpackage-lock.json
knobo
20

npm cieliminará cualquier carpeta node_modules existente y se basará en el 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 tuberías ci / cd y construcciones de acopladores! También lo usa para instalar todo de una vez y no paquetes específicos.

James Harrison
fuente
9

La documentación que vinculó tenía el resumen:

En resumen, las principales diferencias entre usar npm install y npm ci son:

  • El proyecto debe tener un paquete existente-lock.json o npm-shrinkwrap.json.
  • Si las dependencias en el bloqueo del paquete no coinciden con las del paquete.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: las dependencias individuales no se pueden agregar con este comando.
  • Si un node_modules ya está 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.
OscarRyz
fuente
2

Los comandos son muy similares en funcionalidad sin embargo, la diferencia está en el enfoque adoptado para instalar las dependencias especificadas en sus package.jsony package-lock.jsonarchivos.

npm cirealiza una instalación limpia de todas las dependencias de su aplicación, mientras que npm installpuede omitir algunas instalaciones si ya existen en el sistema. Puede surgir un problema si la versión ya instalada en el sistema no es la que package.jsondesea instalar, es decir, la versión instalada es diferente de la ' requerida versión '.

Otras diferencias serían que npm cinunca toca tus package*.jsonarchivos. Parará la instalación y mostrará un error si las versiones de dependencia no coinciden en el package.jsonypackage-lock.json archivos .

Puedes leer una explicación mucho mejor de los documentos oficiales aquí .

Además, es posible que desee leer acerca de los bloqueos de paquetes aquí .

Krishnakeshan
fuente
1

Vale la pena tener en cuenta que las imágenes de acoplador de nodo ligero como alpine no tienen instalado Python, que es una dependencia de la node-gypcual es utilizado por npm ci.

Creo que es un poco obstinado que para tener npm citrabajo necesita instalar Python como dependencia en su compilación.

Más información aquí Docker y npm - gyp ERR! no está bien

teseo
fuente
0

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 ideal 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 usen otras personas (NO lo incluye node_modulesen dicho lanzamiento) . Con respecto al almacenamiento en caché, tenga cuidado, si planea admitir diferentes versiones de Node.jsrecuerde que node_modulespodría tener que reinstalarse debido a las diferencias entre los Node.jsrequisitos de tiempo de ejecución. Si desea apegarse a una versión, adhiérase a la última LTS.

npm cidebe usarse cuando vaya a probar y lanzar una aplicación de producción (un producto final, que no 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 hará que su aplicación es más confiable (lo incluye node_modulesen tal versión) . Seguir con la LTSversión de Node.js.

Bonificación: puedes mezclarlos dependiendo de lo complejo que quieras hacerlo. En las ramas de características en las gitque puede almacenar en caché node_modulespara aumentar la productividad de sus equipos y en la solicitud de fusión y las ramas maestras confían en npm ciun resultado determinista.

K - La toxicidad en SO está creciendo.
fuente