¿Debo enviar el archivo package-lock.json creado por npm 5?
npm 5 se lanzó hoy y una de las nuevas características incluye instalaciones deterministas con la creación de un package-lock.json
archivo.
¿Se supone que este archivo debe mantenerse en control de código fuente?
Supongo que es similar a yarn.lock
y composer.lock
, y se supone que ambos deben mantenerse en control de fuente.
Sí, package-lock.json
está destinado a ser registrado en el control de fuente. Si está utilizando npm 5+, es posible que vea este aviso en la línea de comando: created a lockfile as package-lock.json. You should commit this file.
Según npm help package-lock.json
:
package-lock.json
se genera automáticamente para cualquier operación en la que npm modifique elnode_modules
árbol opackage.json
. Describe el árbol exacto que se generó, de modo que las instalaciones posteriores puedan generar árboles idénticos, independientemente de las actualizaciones de dependencia intermedias.Este archivo está destinado a guardarse en repositorios de origen y sirve para varios propósitos:
Describa una representación única de un árbol de dependencias de modo que se garantice que los compañeros de equipo, las implementaciones y la integración continua instalen exactamente las mismas dependencias.
Proporcionar una posibilidad para que los usuarios "viajen en el tiempo" a estados anteriores
node_modules
sin tener que confirmar el directorio.Para facilitar una mayor visibilidad de los cambios del árbol a través de diferencias de control de fuente legibles.
Y optimice el proceso de instalación permitiendo que npm omita resoluciones repetidas de metadatos para paquetes instalados previamente.
Un detalle clave
package-lock.json
es que no se puede publicar y se ignorará si se encuentra en cualquier lugar que no sea el paquete de nivel superior. Comparte formato con npm-shrinkwrap.json, que es esencialmente el mismo archivo, pero permite la publicación. Esto no se recomienda a menos que implemente una herramienta CLI o utilice el proceso de publicación para producir paquetes de producción.Si ambos
package-lock.json
ynpm-shrinkwrap.json
están presentes en la raíz de un paquete,package-lock.json
se ignorarán por completo.
Si deberías:
- cometer el
package-lock.json
. - úselo
npm ci
en lugar denpm install
cuando cree sus aplicaciones tanto en su CI como en su máquina de desarrollo local
El npm ci
flujo de trabajo requiere la existencia de un archivo package-lock.json
.
Una gran desventaja del npm install
comando es su comportamiento inesperado que puede mutar package-lock.json
, mientras que npm ci
solo usa las versiones especificadas en el archivo de bloqueo y produce un error.
- si
package-lock.json
ypackage.json
no están sincronizados - si
package-lock.json
falta a.
Por lo tanto, ejecutar npm install
localmente, especialmente. en equipos más grandes con varios desarrolladores, puede generar muchos conflictos dentro del programa package-lock.json
y que los desarrolladores decidan eliminarlo por completo package-lock.json
.
Sin embargo, existe un fuerte caso de uso para poder confiar en que las dependencias del proyecto se resuelven repetidamente de manera confiable en diferentes máquinas.
De a package-lock.json
se obtiene exactamente eso: un estado de funcionamiento conocido.
En el pasado, tenía proyectos sin archivos // package-lock.json
cuya compilación fallaría algún día porque una dependencia aleatoria recibió una actualización importante.npm-shrinkwrap.json
yarn.lock
Estos problemas son difíciles de resolver ya que a veces hay que adivinar cuál fue la última versión funcional.
Si desea agregar una nueva dependencia, aún debe ejecutar npm install {dependency}
. Si desea actualizar, utilice npm update {dependency}
o npm install ${dependendency}@{version}
y confirme el archivo package-lock.json
.
Si falla una actualización, puede volver al último archivo funcional conocido package-lock.json
.
Para citar npm doc :
Se recomienda encarecidamente que envíe el bloqueo del paquete generado al control de código fuente: esto permitirá que cualquier otra persona de su equipo, sus implementaciones, su CI/integración continua y cualquier otra persona que ejecute npm install en el código fuente de su paquete obtenga exactamente el mismo árbol de dependencia. que estabas desarrollando. Además, las diferencias de estos cambios son legibles por humanos y le informarán de cualquier cambio que npm haya realizado en sus node_modules, para que pueda notar si se actualizó, elevó, etc. alguna dependencia transitiva.
Y con respecto a la diferencia entre npm ci
vsnpm install
:
- 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
se cerrará 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
node_modules
ya está presente, se eliminará automáticamente antes de quenpm ci
comience su instalación.- Nunca escribirá en
package.json
ninguno de los paquetes bloqueados: las instalaciones están esencialmente congeladas.
Nota: publiqué una respuesta similar aquí.
Sí, está destinado a ser registrado. Quiero sugerir que obtenga su propio compromiso único. Descubrimos que agrega mucho ruido a nuestros diferenciales.
Sí, la mejor práctica es realizar el check-in (SÍ, CHECK-IN)
Estoy de acuerdo en que causará mucho ruido o conflicto al ver la diferencia. Pero los beneficios son:
- Garantice exactamente la misma versión de cada paquete entre sus entornos de desarrollo y producción . Esta parte es la más importante cuando se construye en diferentes entornos en diferentes momentos. Puede usarlo
^1.2.3
en supackage.json
, pero ¿cómo puede asegurarse de que cada veznpm install
elija la misma versión en su máquina de desarrollo y en el servidor de compilación, especialmente aquellos paquetes de dependencia indirecta? Bueno,package-lock.json
me aseguraré de eso. (Con la ayuda delnpm ci
cual se instalan paquetes basados en el archivo de bloqueo) - Mejora el proceso de instalación.
- Ayuda con la nueva función de auditoría
npm audit fix
.
No comprometo este archivo en mis proyectos. Cuál es el punto de ?
- se genera
- Es la causa de un error de integridad del código SHA1 en gitlab con compilaciones gitlab-ci.yml
Aunque es cierto que nunca uso ^ en mi paquete.json para bibliotecas porque tuve malas experiencias con él.
[EDITAR] Esta respuesta está desactualizada (2018) y, para ser justos, también carece de conocimiento. A partir de abril de 2023, mi respuesta sería => POR SUPUESTO, DEBE COMPROMETER ESTE ARCHIVO : por ejemplo, el comando de instalación estándar en plataformas CI necesitaría npm ci
que ese archivo funcione correctamente para ASEGURAR que el árbol de dependencias sea exactamente el mismo que el confirmado;