Recientemente actualicé a npm @ 5 . Ahora tengo un archivo package-lock.json con todo, desde package.json . Esperaría eso, cuando ejecuto npm install
que las versiones de dependencia se extraerían del archivo de bloqueo para determinar qué debería instalarse en mi directorio node_modules . Lo extraño es que en realidad termina modificando y reescribiendo mi archivo package-lock.json .
Por ejemplo, el archivo de bloqueo tenía un mecanografiado especificado en la versión 2.1.6 . Luego, después del npm install
comando, la versión se cambió a 2.4.1 . Eso parece anular todo el propósito de un archivo de bloqueo.
¿Qué me estoy perdiendo? ¿Cómo consigo que npm respete realmente mi archivo de bloqueo?
node.js
npm
npm-install
package-lock.json
Viper Bailey
fuente
fuente
package-lock.json
se regenera cuando corronpm install
. Esto huele a un error npm. ¿Utiliza su propio registro?--no-save
evita cambiar el archivo de bloqueo, pero no afecta a la tonta actualización de dependencia de primer nivel que menciona el OP.Respuestas:
Actualización 3: Como también señalan otras respuestas, el
npm ci
comando se introdujo en npm 5.7.0 como una forma adicional de lograr compilaciones rápidas y reproducibles en el contexto de CI. Consulte la documentación y el blog de npm para obtener más información.Actualización 2: El problema para actualizar y aclarar la documentación es el problema # 18103 de GitHub .
Actualización 1: El comportamiento que se describe a continuación se solucionó en npm 5.4.2: el comportamiento previsto actualmente se describe en el problema de GitHub # 17979 .
Respuesta original: El comportamiento de
package-lock.json
se modificó en npm 5.1.0 como se discutió en el número 16866 . Al parecer, el comportamiento que observa es intencionado por npm a partir de la versión 5.1.0.Eso significa que
package.json
puede anularsepackage-lock.json
siempre que se encuentre una versión más nueva para una dependencia enpackage.json
. Si desea fijar sus dependencias de manera efectiva, ahora debe especificar las versiones sin un prefijo, por ejemplo, debe escribirlas como en1.2.0
lugar de~1.2.0
o^1.2.0
. Luego, la combinación depackage.json
ypackage-lock.json
producirá compilaciones reproducibles. Para ser claros: ¡package-lock.json
solo ya no bloquea las dependencias de nivel raíz!Si esta decisión de diseño fue buena o no es discutible, hay una discusión en curso como resultado de esta confusión en GitHub en el número 17979 . (En mi opinión, es una decisión cuestionable; al menos el nombre
lock
ya no es cierto).Una nota adicional: también hay una restricción para los registros que no admiten paquetes inmutables, como cuando extrae paquetes directamente desde GitHub en lugar de npmjs.org. Consulte esta documentación de bloqueos de paquetes para obtener más explicaciones.
fuente
npm update
entonces? : o Tengo la misma sensación de quenpm install
actualicé los deps, pero no quiero creerlo ... pero parece que es tristemente cierto ... De todos modos, todavía hay una opciónnpm shrinkwrap
para bloquear los deps, pero definitivamente el nombre de package-lock es incorrecto ya que no se congela, ni bloquea las dependencias ..Descubrí que habrá una nueva versión de npm 5.7.1 con el nuevo comando
npm ci
, que se instalarápackage-lock.json
solo desdefuente
npm install
" antes de ejecutar el comandonpm ci
en ese proyecto. ¿Nonpm install
sobrescribe el archivo package-lock.json?npm
solo cambia el archivo de bloqueo si es necesario para cumplir con la especificación en packages.json . Entonces, si los paquetes solían decirthatpackage: 1
, y lock dice..: 1.0.4
, dev puede editar para decirthatpackage: 2
, y eso obligará a cambiar el archivo de bloqueo, porque1.0.4
no es compatible con el rango recientemente especificado. Si no cambiapackages.json
, permanecerá bloqueado en la versión exacta, hasta que elimine el archivo de bloqueo. [Si no permanece bloqueado y no cambió los paquetes.json, presente un informe de error.]Use el recién introducido
Presentamos
npm ci
construcciones más rápidas y confiablesfuente
npm ci
, y solo usamosnpm install
si actualizamos o instalamos nuevos paquetes.node_modules
directorio existente y se reconstruya localmente, incluso si ese es un enlace simbólico vacío pero importante. :(npm ci
, espero que sean muy reacios a introducir cualquier cosa que pueda reducir el rendimiento para un caso de uso bastante poco común. Es posible que desee consultar pnpm.js.org, aunque eso hace uso de enlaces duros para reducir el uso del disco.Respuesta corta:
npm install
honra package-lock.json solo si cumple los requisitos de package.json.npm ci
.Aquí hay un escenario que podría explicar cosas (verificado con NPM 6.3.0)
Declaras una dependencia en package.json como:
Luego lo haces,
npm install
lo que generará un paquete-lock.json con:Pocos días después, se lanza una versión menor más nueva de "depA", digamos "1.1.0", luego lo siguiente es cierto:
A continuación, actualice manualmente su package.json a:
Luego vuelva a ejecutar:
fuente
npm install
utilizará las versiones bloqueadas de apackage-lock.json
menos que no satisfaga elpackage.json
en cuyo caso instala package.json y reconstruye package-lock.json en consecuencia. Si ha cambiado supackage.json
de tal manera que el paquete de frenos existentes sigue reuniendo las actualizanpackage.json
se seguirá utilizando quepackage-lock
npm install
no hace nada, independientemente de package-lock.json. Tenemos que actualizar explícitamente los paquetes incluso cuando hay actualizaciones disponibles que coinciden con el semver especificado en package.json. Al menos esa ha sido mi experiencia durante años.node_modules
satisface el rangopackage.json
y no hay ningúnpackage-lock.json
archivo, npm no actualizará el módulo cuando se ejecutenpm install
. Supongo que está bien, ya que puede usarnpm update
(onpm-check
para la última) para actualizar las dependencias, y este comportamiento es más rápido para el caso de alguien que simplemente agrega una entradapackage.json
y no desea que los paquetes no relacionados se actualicen a la última que satisface el semverver rango.Use el
npm ci
comando en lugar denpm install
."ci" significa "integración continua".
Instalará las dependencias del proyecto basadas en el archivo package-lock.json en lugar de las dependencias indulgentes del archivo package.json.
Producirá construcciones idénticas para tus compañeros de equipo y también es mucho más rápido.
Puede leer más al respecto en esta publicación de blog: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable
fuente
ci
se refiere a la "integración continua", como se menciona en los documentos y la publicación de blog que anuncia el comando: blog.npmjs.org/post/171556855892/…node_modules
carpeta y la volverá a crear desde cero. ¿Es realmente mucho más rápido? ¿npm install
Eliminarnode_modules
carpeta también?npm install
tiene que resolver todas las dependencias del paquete cuando se ejecuta.npm ci
es solo una lista de compras de "obtener estos módulos exactos".En el futuro, podrá usar un
--from-lock-file
indicador (o similar) para instalar solo desde elpackage-lock.json
sin modificarlo.Esto será útil para entornos de CI, etc., donde las construcciones reproducibles son importantes.
Consulte https://github.com/npm/npm/issues/18286 para el seguimiento de la función.
fuente
npm ci
que también maneja su pregunta.Parece que este problema se solucionó en npm v5.4.2
https://github.com/npm/npm/issues/17979
(Desplácese hasta el último comentario en el hilo)
Actualizar
Realmente arreglado en 5.6.0. Hubo un error multiplataforma en 5.4.2 que todavía causaba el problema.
https://github.com/npm/npm/issues/18712
Actualización 2
Vea mi respuesta aquí: https://stackoverflow.com/a/53680257/1611058
npm ci
es el comando que debe usar al instalar proyectos existentes ahora.fuente
npm i
. Por ejemplo, el módulofsevents
se elimina cuando estoynpm i
en una máquina que no es compatiblefsevents
y luego el módulo se vuelve a agregar cuando senpm i
vuelve a instalar en una máquina que sí.fsevents
caída en mipackage-lock.json
con[email protected]
la vez que colaboran con Mac OS X contribuyentes. Si no has abierto un problema, lo haré.Probablemente tengas algo como:
en
package.json
que npm se actualiza a la última versión menor, en su caso2.4.1
Más sobre
package-lock.json
:package-lock.json se genera automáticamente para cualquier operación en la que npm modifique el árbol node_modules o package.json. Describe el árbol exacto que se generó, de modo que las instalaciones posteriores pueden generar árboles idénticos, independientemente de las actualizaciones de dependencia intermedias.
Este archivo está destinado a ser confirmado en repositorios de origen y sirve para varios propósitos:
https://docs.npmjs.com/files/package-lock.json
fuente
package-lock.json
se tira hacia abajo y luego lo ejecutamosnpm install
, pero elpackage-lock.json
archivo se modifica y tenemos que realizar un reinicio antes de que podamos sacar los siguientes cambios.Probablemente deberías usar algo como esto
En lugar de usarlo
npm install
si no desea cambiar la versión de su paquete.Según la documentación oficial, ambos
npm install
enpm ci
instalan las dependencias que se necesitan para el proyecto.fuente
Hay un problema abierto para esto en su página de github: https://github.com/npm/npm/issues/18712
Este problema es más grave cuando los desarrolladores utilizan diferentes sistemas operativos.
fuente
EDITAR: el nombre "bloqueo" es complicado, su NPM intenta ponerse al día con Yarn. No es un archivo bloqueado en absoluto.
package.json
es un archivo fijo por el usuario, que una vez "instalado" generará el árbol de carpetas node_modules y ese árbol se escribirá en élpackage-lock.json
. Como puede ver, es al revés: las versiones de dependencia se extraeránpackage.json
como siempre, ypackage-lock.json
deberían llamarsepackage-tree.json
(Espero que esto haya aclarado mi respuesta, después de tantos votos negativos)
Una respuesta simplista:
package.json
tenga sus dependencias como de costumbre, mientras quepackage-lock.json
es "un árbol node_modules exacto y más importante reproducible" (tomado de npm docs ).En cuanto al nombre complicado, su NPM intenta ponerse al día con Yarn.
fuente