npm @ 5 został opublikowany, ma nową funkcję pakiet-lock.json (po npm install
), która mnie myli. Chcę wiedzieć, jaki jest efekt tego pliku?
Przechowuje dokładne, wersjonowane drzewo zależności zamiast używania wersji oznaczonej gwiazdką, takiej jak sam pakiet.json (np. 1.0. *). Oznacza to, że możesz zagwarantować zależności dla innych programistów lub wydań prod, itp. Posiada również mechanizm blokowania drzewa, ale generalnie zostanie zregenerowany, jeśli zmieni się pakiet.json.
Z dokumentów npm :
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 gwarantowały 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 poprzez czytelne różnice w 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. ”
Aby odpowiedzieć na pytanie jrahhali poniżej dotyczące samego użycia pliku package.json z dokładnymi numerami wersji. Pamiętaj, że plik package.json zawiera tylko bezpośrednie zależności, a nie zależności zależności (czasami nazywane zależnościami zagnieżdżonymi). Oznacza to, że za pomocą standardowego pliku package.json nie można kontrolować wersji tych zagnieżdżonych zależności, odwoływanie się do nich bezpośrednio lub ponieważ zależności równorzędne nie pomogą, ponieważ nie kontroluje się także tolerancji wersji, którą definiują bezpośrednie zależności dla tych zagnieżdżonych zależności .
Nawet jeśli zablokujesz wersje swoich bezpośrednich zależności, nie możesz w 100% zagwarantować, że twoje pełne drzewo zależności będzie za każdym razem identyczne. Po drugie, możesz zezwolić na niełamliwe zmiany (oparte na wersjach semantycznych) swoich bezpośrednich zależności, co daje jeszcze mniejszą kontrolę nad zagnieżdżonymi zależnościami, a ponadto nie możesz zagwarantować, że twoje bezpośrednie zależności w pewnym momencie nie złamią reguł wersjonowania semantycznego sami.
Rozwiązaniem tego wszystkiego jest plik blokady, który, jak opisano powyżej, blokuje się w wersjach pełnego drzewa zależności. Pozwala to zagwarantować drzewo zależności dla innych programistów lub wydań, jednocześnie umożliwiając testowanie nowych wersji zależności (bezpośrednich lub pośrednich) przy użyciu standardowego pliku package.json.
NB Poprzedni plik JSON owijania w folię termokurczliwą zrobił prawie to samo, ale plik blokady zmienia jego nazwę, dzięki czemu jego funkcja jest wyraźniejsza. Jeśli w projekcie znajduje się już plik obkurczania, zostanie on użyty zamiast dowolnego pliku blokady.
package-lock.json
Plik jest aktualizowany za każdym razem, kiedy zadzwonić npm zainstalować od KMP 5.1. (zmiana w github.com/npm/npm/issues/16866 , przykład w github.com/npm/npm/issues/17979 ) Dlatego nie można go używać do ustawiania tych samych wersji dla wszystkich programistów , chyba że podasz dokładne wersje jak1.2.3
zamiast1.2.*
w twoimpackage.json
pliku.npm ci
as,npm install
które zaktualizuje pakiet-lock.json, podczas gdy ci używa jego zawartości. Tylko dziękinpm ci
temu otrzymasz powtarzalne, solidne kompilacje.Jest to bardzo ważne ulepszenie dla npm: gwarantuje dokładnie taką samą wersję każdego pakietu .
Jak upewnić się, że Twój projekt zbudowano z tych samych pakietów w różnych środowiskach w innym czasie? Powiedzmy, że możesz używać
^1.2.3
w swoim systemiepackage.json
lub niektóre zależności używają w ten sposób, ale w jaki sposób możesz upewnić się, że za każdym razemnpm install
wybierzesz tę samą wersję na komputerze dewelopera i na serwerze kompilacji? Package-lock.json to zapewni.npm install
ponownie wygeneruje plik blokady, gdy jest on na serwerze kompilacji lub serwerze wdrażania, wykonajnpm ci
(który przeczyta plik blokady i zainstaluje całe drzewo pakietów)źródło
package-lock.json
pliku. Po prostu instaluje siępackage.json
tak jak kiedyś. Aby skorzystać zpackage-lock.json
pliku, musisz użyć nowej komendy „npm ci”, która zainstaluje dokładne wersje wymienione wpackage-lock.json
zamiast zakresów wersji podanych wpackage.json
.npm install
nie czytać zpackage-lock.json
. Aby odtworzyć, wykonaj następujące czynności. używając this package.json, uruchomnpm install
{... "devDependencies": {"sinon": "7.2.2"}} Teraz skopiuj / wklejpackage.json
ipackage-lock.json
do nowego katalogu. Zmieńpackage.json
na: „sinon”: „^ 7.2.2” uruchomnpm install
. npm czyta z package-lock.json i instaluje 7.2.2 zamiast 7.3.0. Bez package-lock.json zainstalowano by 7.3.0.package-lock.json
, jedynym rozsądnym sposobem na to jest usunięciepackage-lock.json
i ponowne wygenerowanie go za pomocąnpm install
. (Nie chcesz ręcznie edytowaćpackage-lock.json
). Zmiana wartości właściwości „version” (u góry)package.json
zmieni się tak samo napackage-lock.json
onnpm install
, ale dodanie karetki do zależności nie spowoduje tego samegopackage-lock.json
.package.json
czymś, co możesz ręcznie zmodyfikować ipackage-lock.json
o czymś, czego nigdy ręcznie nie dotykasz. Zawsze kontrolujesz wersje OBIE pliki - szczególniepackage-lock.json
. Otwórz oba pliki, ręcznie edytuj nazwę projektupackage.json
, uruchomnpm install
i obserwuj, jak zmienia się nazwa projektupackage-lock.json
.license
nie wydaje się być zarejestrowany wpackage-lock.json
.npm ci
,npm install
po prostu użyje pliku package.json, nawet jeśli plik blokady jest udostępnionypackage-lock.json
jest zapisywany w przypadku zmiany wartości liczbowej we właściwości takiej jak właściwość „wersja” lub właściwości zależnościpackage.json
.Jeśli te wartości liczbowe w
package.json
i sąpackage-lock.json
zgodne,package-lock.json
zostanie odczytane z.Jeśli te wartości liczbowe w
package.json
ipackage-lock.json
nie pasują do siebie,package-lock.json
zostanie zapisane z tymi nowymi wartościami i nowymi modyfikatorami, takimi jak daszek i tylda, jeśli są obecne. Ale to cyfra powoduje zmianę napackage-lock.json
.Aby zobaczyć, co mam na myśli, wykonaj następujące czynności. Używając
package.json
bezpackage-lock.json
, uruchomnpm install
z:package-lock.json
będzie teraz mieć:Teraz skopiuj / wklej oba pliki do nowego katalogu. Zmień
package.json
na (tylko dodając karetkę):biegnij
npm install
. Gdyby nie byłopackage-lock.json
pliku, zostałby zainstalowany [email protected].npm install
jest odczyt zpackage-lock.json
i instalacji 7.2.2.Teraz zmień
package.json
na:biegnij
npm install
.package-lock.json
został napisany i pokaże teraz:źródło
Jedną ważną rzeczą, o której należy również wspomnieć, jest poprawa bezpieczeństwa dostarczana z plikiem blokady pakietu. Ponieważ przechowuje wszystkie skróty pakietów, jeśli ktoś miałby manipulować publicznym rejestrem npm i zmienić kod źródłowy pakietu, nawet nie zmieniając wersji samego pakietu, zostałby wykryty przez plik blokady pakietu.
źródło
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.
Opisuje pojedynczą reprezentację drzewa zależności, dzięki czemu koledzy z zespołu, wdrożenia i ciągła integracja mają zagwarantowane zainstalowanie dokładnie tych samych zależności. Zawiera następujące właściwości.
}
źródło
Ten plik jest automatycznie tworzony i używany przez npm do śledzenia instalacji pakietów i lepszego zarządzania stanem i historią zależności twojego projektu. Nie powinieneś zmieniać zawartości tego pliku.
źródło
package-lock.json: Zawiera dokładne informacje o wersji aktualnie zainstalowanej dla Twojej aplikacji.
źródło