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?
fuente
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?
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 installnpm-shrinkwrap.jsony package-lock.json(en ese orden).node_modules.package.jsono package-lock.json.
npm i packagename), puede escribir package.jsonpara agregar o actualizar la dependencia.npm i) puede escribir para package-lock.jsonbloquear la versión de algunas dependencias si aún no están en este archivo.npm cipackage-lock.jsono npm-shrinkwrap.jsonestar presente.package.json.node_modulese instala todas las dependencias a la vez.package.jsono package-lock.json.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
npm installpodía escribir en package.json. ¿Sabes lo que podría escribir aquí?npm install packagepodría modificar tantopackage-lock.jsonypackage.json, mientrasnpm installargumentos whithout sólo se modificaríanpackage-lock.jsonnpm cieliminará cualquier carpeta node_modules existente y se basará en elpackage-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.fuente
La documentación que vinculó tenía el resumen:
fuente
Los comandos son muy similares en funcionalidad sin embargo, la diferencia está en el enfoque adoptado para instalar las dependencias especificadas en sus
package.jsonypackage-lock.jsonarchivos.npm cirealiza una instalación limpia de todas las dependencias de su aplicación, mientras quenpm 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 quepackage.jsondesea instalar, es decir, la versión instalada es diferente de la ' requerida versión '.Otras diferencias serían que
npm cinunca toca tuspackage*.jsonarchivos. Parará la instalación y mostrará un error si las versiones de dependencia no coinciden en elpackage.jsonypackage-lock.jsonarchivos .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í .
fuente
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 pornpm 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
fuente
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é elnode_modulesdirectorio. ¿Cuándo usar esto? Puede hacer esto si está creando un paquete para que lo usen otras personas (NO lo incluyenode_modulesen dicho lanzamiento) . Con respecto al almacenamiento en caché, tenga cuidado, si planea admitir diferentes versiones deNode.jsrecuerde quenode_modulespodría tener que reinstalarse debido a las diferencias entre losNode.jsrequisitos de tiempo de ejecución. Si desea apegarse a una versión, adhiérase a la últimaLTS.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 incluyenode_modulesen tal versión) . Seguir con laLTSversión deNode.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 ennpm ciun resultado determinista.fuente