Você provavelmente tem algo como:
"typescript":"~2.1.6"
no package.json
qual npm é atualizado para a versão secundária mais recente, no seu caso2.4.1
Edit: Pergunta do OP
Mas isso não explica por que "npm install" alteraria o arquivo de bloqueio. O arquivo de bloqueio não serve para criar uma compilação reproduzível? Nesse caso, independentemente do valor semver, ele ainda deve usar a mesma versão 2.1.6.
Responda:
Isso tem como objetivo bloquear sua árvore de dependência completa. Digamos que typescript v2.4.1
requer widget ~v1.0.0
. Quando você instala, ele pega widget v1.0.0
. Posteriormente, seu colega desenvolvedor (ou compilação de IC) instala e obtém o npm, typescript v2.4.1
mas widget
foi atualizado para widget v1.0.1
. Agora o seu módulo do nó está fora de sincronia. Isto é o que package-lock.json
impede.
Ou mais geralmente:
Como exemplo, considere
pacote A:
{"nome": "A", "versão": "0.1.0", "dependências": {"B": "<0.1.0"}}
pacote B:
{"nome": "B", "versão": "0.0.1", "dependências": {"C": "<0.1.0"}}
e pacote C:
{"nome": "C", "versão": "0.0.1"}
Se estas são as únicas versões de A, B e C disponíveis no registro, uma instalação normal do npm A instalará:
A@0.1.0 - B@0.0.1 - C@0.0.1
No entanto, se B@0.0.2 for publicado, uma nova instalação do NPM A será instalada:
A@0.1.0 - B@0.0.2 - C@0.0.1 assumindo que a nova versão não modificou as dependências de B. Obviamente, a nova versão do B pode incluir uma nova versão do C e qualquer número de novas dependências. Se tais alterações forem indesejáveis, o autor de A poderá especificar uma dependência em B@0.0.1. No entanto, se o autor de A e o autor de B não são a mesma pessoa, não há como o autor de A dizer que ele ou ela não deseja obter versões recém-publicadas de C quando B não mudou.
OP Pergunta 2: Então, deixe-me ver se entendi corretamente. O que você está dizendo é que o arquivo de bloqueio especifica as versões das dependências secundárias, mas ainda depende da correspondência difusa do package.json para determinar as dependências de nível superior. Isso é preciso?
Resposta: Não. Package-lock bloqueia toda a árvore de pacotes, incluindo os pacotes raiz descritos em package.json
. Se typescript
estiver bloqueado no 2.4.1
seu package-lock.json
, ele deve permanecer assim até que seja alterado. E digamos que amanhã typescript
libere a versão 2.4.2
. Se eu fizer o checkout do seu ramo e executar npm install
, o npm respeitará o arquivo de bloqueio e a instalação 2.4.1
.
Mais sobre package-lock.json
:
O package-lock.json é gerado automaticamente para qualquer operação em que o npm modifique a árvore node_modules ou o package.json. Ele descreve a árvore exata que foi gerada, de forma que as instalações subseqüentes possam gerar árvores idênticas, independentemente das atualizações intermediárias de dependência.
Este arquivo deve ser confirmado nos repositórios de origem e serve a vários propósitos:
Descreva uma única representação de uma árvore de dependência, de modo que colegas de equipe, implantações e integração contínua garantam a instalação exatamente das mesmas dependências.
Forneça um recurso para os usuários "viajarem no tempo" para estados anteriores de node_modules sem precisar confirmar o próprio diretório.
Para facilitar uma maior visibilidade das alterações nas árvores por meio de diferenças de controle de fonte legíveis.
E otimize o processo de instalação, permitindo que o npm pule resoluções repetidas de metadados para pacotes instalados anteriormente.
https://docs.npmjs.com/files/package-lock.json