Recientemente actualicé a npm @ 5 . Ahora tengo un archivo package-lock.json con todo, desde package.json . Esperaría eso, cuando ejecuto npm installque 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 installcomando, 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.jsonse regenera cuando corronpm install. Esto huele a un error npm. ¿Utiliza su propio registro?--no-saveevita 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 cicomando 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.jsonse 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.jsonpuede anularsepackage-lock.jsonsiempre 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.0lugar de~1.2.0o^1.2.0. Luego, la combinación depackage.jsonypackage-lock.jsonproducirá compilaciones reproducibles. Para ser claros: ¡package-lock.jsonsolo 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
lockya 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 updateentonces? : o Tengo la misma sensación de quenpm installactualicé los deps, pero no quiero creerlo ... pero parece que es tristemente cierto ... De todos modos, todavía hay una opciónnpm shrinkwrappara 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.jsonsolo desdefuente
npm install" antes de ejecutar el comandonpm cien ese proyecto. ¿Nonpm installsobrescribe el archivo package-lock.json?npmsolo 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.4no 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 ciconstrucciones más rápidas y confiablesfuente
npm ci, y solo usamosnpm installsi actualizamos o instalamos nuevos paquetes.node_modulesdirectorio 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 installhonra 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 installlo 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 installutilizará las versiones bloqueadas de apackage-lock.jsonmenos que no satisfaga elpackage.jsonen cuyo caso instala package.json y reconstruye package-lock.json en consecuencia. Si ha cambiado supackage.jsonde tal manera que el paquete de frenos existentes sigue reuniendo las actualizanpackage.jsonse seguirá utilizando quepackage-locknpm installno 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_modulessatisface el rangopackage.jsony no hay ningúnpackage-lock.jsonarchivo, npm no actualizará el módulo cuando se ejecutenpm install. Supongo que está bien, ya que puede usarnpm update(onpm-checkpara la última) para actualizar las dependencias, y este comportamiento es más rápido para el caso de alguien que simplemente agrega una entradapackage.jsony no desea que los paquetes no relacionados se actualicen a la última que satisface el semverver rango.Use el
npm cicomando 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
cise 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_modulescarpeta y la volverá a crear desde cero. ¿Es realmente mucho más rápido? ¿npm installEliminarnode_modulescarpeta también?npm installtiene que resolver todas las dependencias del paquete cuando se ejecuta.npm cies solo una lista de compras de "obtener estos módulos exactos".En el futuro, podrá usar un
--from-lock-fileindicador (o similar) para instalar solo desde elpackage-lock.jsonsin 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 cique 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 cies el comando que debe usar al instalar proyectos existentes ahora.fuente
npm i. Por ejemplo, el módulofseventsse elimina cuando estoynpm ien una máquina que no es compatiblefseventsy luego el módulo se vuelve a agregar cuando senpm ivuelve a instalar en una máquina que sí.fseventscaída en mipackage-lock.jsoncon[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.jsonque npm se actualiza a la última versión menor, en su caso2.4.1Má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.jsonse tira hacia abajo y luego lo ejecutamosnpm install, pero elpackage-lock.jsonarchivo 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 installsi no desea cambiar la versión de su paquete.Según la documentación oficial, ambos
npm installenpm ciinstalan 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.jsones 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.jsoncomo siempre, ypackage-lock.jsondeberían llamarsepackage-tree.json(Espero que esto haya aclarado mi respuesta, después de tantos votos negativos)
Una respuesta simplista:
package.jsontenga sus dependencias como de costumbre, mientras quepackage-lock.jsones "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