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 install
lee package.json
para crear una lista de dependencias y se usa package-lock.json
para 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.json
y usos package.json
sólo para validar que no hay versiones no coincidentes. Si falta alguna dependencia o tiene versiones incompatibles, arrojará un error .
Se usa npm install
para 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 ci
en este caso.
Úselo 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
npm-shrinkwrap.json
y package-lock.json
(en ese orden).node_modules
.package.json
o package-lock.json
.
npm i packagename
), puede escribir package.json
para agregar o actualizar la dependencia.npm i
) puede escribir para package-lock.json
bloquear la versión de algunas dependencias si aún no están en este archivo.npm ci
package-lock.json
o npm-shrinkwrap.json
estar presente.package.json
.node_modules
e instala todas las dependencias a la vez.package.json
o package-lock.json
.Mientras npm ci
genera todo el árbol de dependencias desde package-lock.json
o 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 install
podía escribir en package.json. ¿Sabes lo que podría escribir aquí?npm install package
podría modificar tantopackage-lock.json
ypackage.json
, mientrasnpm install
argumentos whithout sólo se modificaríanpackage-lock.json
npm ci
eliminará cualquier carpeta node_modules existente y se basará en elpackage-lock.json
archivo 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.json
ypackage-lock.json
archivos.npm ci
realiza una instalación limpia de todas las dependencias de su aplicación, mientras quenpm install
puede 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.json
desea instalar, es decir, la versión instalada es diferente de la ' requerida versión '.Otras diferencias serían que
npm ci
nunca toca tuspackage*.json
archivos. Parará la instalación y mostrará un error si las versiones de dependencia no coinciden en elpackage.json
ypackage-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í .
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-gyp
cual es utilizado pornpm ci
.Creo que es un poco obstinado que para tener
npm ci
trabajo 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 install
es ideal para el desarrollo y en el CI cuando desea almacenar en caché elnode_modules
directorio. ¿Cuándo usar esto? Puede hacer esto si está creando un paquete para que lo usen otras personas (NO lo incluyenode_modules
en dicho lanzamiento) . Con respecto al almacenamiento en caché, tenga cuidado, si planea admitir diferentes versiones deNode.js
recuerde quenode_modules
podría tener que reinstalarse debido a las diferencias entre losNode.js
requisitos de tiempo de ejecución. Si desea apegarse a una versión, adhiérase a la últimaLTS
.npm ci
debe 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_modules
en tal versión) . Seguir con laLTS
versión deNode.js
.Bonificación: puedes mezclarlos dependiendo de lo complejo que quieras hacerlo. En las ramas de características en las
git
que puede almacenar en cachénode_modules
para aumentar la productividad de sus equipos y en la solicitud de fusión y las ramas maestras confían ennpm ci
un resultado determinista.fuente