Probablemente tengas algo como:
"typescript":"~2.1.6"
en package.json
que npm se actualiza a la última versión menor, en su caso2.4.1
Editar: Pregunta de OP
Pero eso no explica por qué "npm install" cambiaría el archivo de bloqueo. ¿No se pretende que el archivo de bloqueo cree una compilación reproducible? Si es así, independientemente del valor de semver, aún debe usar la misma versión 2.1.6.
Responder:
Esto está destinado a bloquear su árbol de dependencia completa. Digamos que typescript v2.4.1
requiere widget ~v1.0.0
. Cuando npm lo instales agarra widget v1.0.0
. Más tarde en su compañero de desarrollador (o acumulación CI) no instala un MNP y obtiene typescript v2.4.1
, pero widget
se ha actualizado a widget v1.0.1
. Ahora su módulo de nodo no está sincronizado. Esto es lo que package-lock.json
impide.
O más generalmente:
Como ejemplo, considere
paquete A:
{"nombre": "A", "versión": "0.1.0", "dependencias": {"B": "<0.1.0"}}
paquete B:
{"nombre": "B", "versión": "0.0.1", "dependencias": {"C": "<0.1.0"}}
y paquete C:
{"nombre": "C", "versión": "0.0.1"}
Si estas son las únicas versiones de A, B y C disponibles en el registro, se instalará una instalación normal de npm A:
A@0.1.0 - B@0.0.1 - C@0.0.1
Sin embargo, si se publica B@0.0.2, se instalará una nueva instalación npm A:
A@0.1.0 - B@0.0.2 - C@0.0.1 suponiendo que la nueva versión no modificó las dependencias de B. Por supuesto, la nueva versión de B podría incluir una nueva versión de C y cualquier cantidad de nuevas dependencias. Si dichos cambios no son deseables, el autor de A podría especificar una dependencia en B@0.0.1. Sin embargo, si el autor de A y el autor de B no son la misma persona, no hay forma de que el autor de A diga que él o ella no quiere obtener versiones recién publicadas de C cuando B no ha cambiado en absoluto.
OP Pregunta 2: Entonces déjame ver si entiendo correctamente. Lo que está diciendo es que el archivo de bloqueo especifica las versiones de las dependencias secundarias, pero aún se basa en la coincidencia aproximada de package.json para determinar las dependencias de nivel superior. ¿Es eso exacto?
Respuesta: No. package-lock bloquea todo el árbol de paquetes, incluidos los paquetes raíz descritos en package.json
. Si typescript
está bloqueado 2.4.1
en su package-lock.json
, debe permanecer así hasta que se cambie. Y digamos que mañana typescript
lanza la versión 2.4.2
. Si npm install
reviso su rama y ejecuto , npm respetará el archivo de bloqueo y la instalación 2.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:
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.
Proporcione una facilidad para que los usuarios "viajen en el tiempo" a estados anteriores de node_modules sin tener que confirmar el directorio en sí.
Para facilitar una mayor visibilidad de los cambios de árbol a través de diferencias de control de fuente legible.
Y optimice el proceso de instalación permitiendo que npm omita las resoluciones de metadatos repetidos para paquetes instalados previamente.
https://docs.npmjs.com/files/package-lock.json