Prawdopodobnie masz coś takiego:
"typescript":"~2.1.6"
w twoim, package.json
które npm aktualizuje do najnowszej mniejszej wersji, w twoim przypadku2.4.1
Edycja: Pytanie od OP
Ale to nie wyjaśnia, dlaczego „instalacja npm” zmienia plik blokady. Czy plik blokady nie służy do tworzenia odtwarzalnej kompilacji? Jeśli tak, niezależnie od wartości semver, powinien nadal używać tej samej wersji 2.1.6.
Odpowiedź:
Ma to na celu zablokowanie pełnego drzewa zależności. Powiedzmy, że typescript v2.4.1
wymaga widget ~v1.0.0
. Po zainstalowaniu npm łapie widget v1.0.0
. Później inny programista (lub kompilacja CI) wykonuje instalację npm i pobiera, typescript v2.4.1
ale widget
została zaktualizowana do widget v1.0.1
. Teraz moduł węzła nie jest zsynchronizowany. Co to jestpackage-lock.json
zapobiega.
Lub bardziej ogólnie:
Jako przykład rozważ
pakiet A:
{„name”: „A”, „version”: „0.1.0”, „dependencies”: {„B”: „<0.1.0”}}
pakiet B:
{„name”: „B”, „version”: „0.0.1”, „dependencies”: {„C”: „<0.1.0”}}
i pakiet C:
{„name”: „C”, „version”: „0.0.1”}
Jeśli są to jedyne wersje A, B i C dostępne w rejestrze, wówczas zainstaluje się normalna instalacja A npm:
A@0.1.0 - B@0.0.1 - C@0.0.1
Jeśli jednak B@0.0.2 zostanie opublikowany, wówczas zainstalowana zostanie nowa instalacja A npm:
A@0.1.0 - B@0.0.2 - C@0.0.1, zakładając, że nowa wersja nie zmodyfikowała zależności B. Oczywiście nowa wersja B mogłaby obejmować nową wersję C i dowolną liczbę nowych zależności. Jeśli takie zmiany są niepożądane, autor A może określić zależność od B@0.0.1. Jeśli jednak autor A i autor B nie są tą samą osobą, autor A nie może powiedzieć, że nie chce pobierać nowo opublikowanych wersji C, gdy B w ogóle się nie zmienił.
Pytanie operacyjne nr 2: Pokażę, czy rozumiem poprawnie. Mówisz, że plik blokady określa wersje drugorzędnych zależności, ale nadal opiera się na rozmytym dopasowaniu pliku package.json w celu ustalenia zależności najwyższego poziomu. Czy to jest dokładne?
Odpowiedź: Nie. Pakiet-lock blokuje całe drzewo pakietów, w tym pakiety główne opisane w package.json
. Jeśli typescript
jest zablokowane 2.4.1
w twoim package-lock.json
, powinno tak pozostać, dopóki nie zostanie zmienione. I powiedzmy, że jutro typescript
wypuszcza wersję 2.4.2
. Jeśli sprawdzę twój oddział i uruchomię npm install
, npm przestrzega pliku blokady i instaluje 2.4.1
.
Więcej na package-lock.json
:
Pakiet-lock.json jest generowany automatycznie dla wszystkich operacji, w których npm modyfikuje drzewo modułów_węzła lub pakiet.json. Opisuje dokładnie wygenerowane drzewo, dzięki czemu kolejne instalacje mogą generować identyczne drzewa, niezależnie od pośrednich aktualizacji zależności.
Ten plik ma być przeznaczony do repozytoriów źródłowych i służy do różnych celów:
Opisz pojedynczą reprezentację drzewa zależności, tak aby członkowie zespołu, wdrożenia i ciągła integracja gwarantowali zainstalowanie dokładnie tych samych zależności.
Zapewnij użytkownikom możliwość „podróży w czasie” do poprzednich stanów modułów_węzła bez konieczności zatwierdzania samego katalogu.
Aby ułatwić lepszą widoczność zmian drzewa dzięki czytelnym różnicom kontroli źródła.
I zoptymalizuj proces instalacji, pozwalając npm na pomijanie powtarzających się rozdzielczości metadanych dla wcześniej zainstalowanych pakietów.
https://docs.npmjs.com/files/package-lock.json