Respuestas:
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 package
podría modificar tanto package-lock.json
y package.json
, mientras npm install
argumentos whithout sólo se modificaríanpackage-lock.json
npm ci
eliminará cualquier carpeta node_modules existente y se basará en el package-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.
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.
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
y package-lock.json
archivos.
npm ci
realiza una instalación limpia de todas las dependencias de su aplicación, mientras que npm 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 que package.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 tus package*.json
archivos. Parará la instalación y mostrará un error si las versiones de dependencia no coinciden en el package.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í .
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 por npm 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
Debes usarlos en diferentes situaciones.
npm install
es ideal para el desarrollo y en el CI cuando desea almacenar en caché el node_modules
directorio. ¿Cuándo usar esto? Puede hacer esto si está creando un paquete para que lo usen otras personas (NO lo incluye node_modules
en dicho lanzamiento) . Con respecto al almacenamiento en caché, tenga cuidado, si planea admitir diferentes versiones de Node.js
recuerde que node_modules
podría tener que reinstalarse debido a las diferencias entre los Node.js
requisitos de tiempo de ejecución. Si desea apegarse a una versión, adhiérase a la última LTS
.
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 incluye node_modules
en tal versión) . Seguir con la LTS
versión de Node.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 en npm ci
un resultado determinista.
npm install
podía escribir en package.json. ¿Sabes lo que podría escribir aquí?