Jaka jest rola pliku package-lock.json?

291

npm @ 5 został opublikowany, ma nową funkcję pakiet-lock.json (po npm install), która mnie myli. Chcę wiedzieć, jaki jest efekt tego pliku?

SecretCastle
źródło

Odpowiedzi:

291

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. ”

Edytować

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.

Matt
źródło
78
Jeśli szukanie dokładnej wersji zależności jest tak poszukiwane, dlaczego nie wymusić podania dokładnej wersji w pakiecie.json i zrezygnować z pliku package-lock.json?
jrahhali
15
@jrahhali - zmieniłem moją odpowiedź w oparciu o twoje pytanie.
Matt
1
W jaki sposób to drzewo zależności od pacakge.json.lock stosuje się do innych programistów? Automatycznie?
stevek
40
Pamiętaj, że ta odpowiedź nie jest już poprawna ! package-lock.jsonPlik 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 jak 1.2.3zamiast 1.2.*w twoim package.jsonpliku.
Christian,
5
Powinieneś dodać odniesienie do npm cias, npm installktóre zaktualizuje pakiet-lock.json, podczas gdy ci używa jego zawartości. Tylko dzięki npm citemu otrzymasz powtarzalne, solidne kompilacje.
k0pernikus
34

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.3w swoim systemie package.jsonlub niektóre zależności używają w ten sposób, ale w jaki sposób możesz upewnić się, że za każdym razem npm installwybierzesz tę samą wersję na komputerze dewelopera i na serwerze kompilacji? Package-lock.json to zapewni.

npm installponownie wygeneruje plik blokady, gdy jest on na serwerze kompilacji lub serwerze wdrażania, wykonaj npm ci(który przeczyta plik blokady i zainstaluje całe drzewo pakietów)

Xin
źródło
9
Zauważ, że teraz jest to trochę przestarzałe. W wersji 5.1.0 „instalacja npm” w ogóle nie czyta z package-lock.jsonpliku. Po prostu instaluje się package.jsontak jak kiedyś. Aby skorzystać z package-lock.jsonpliku, musisz użyć nowej komendy „npm ci”, która zainstaluje dokładne wersje wymienione w package-lock.jsonzamiast zakresów wersji podanych w package.json.
Venryx,
5
Obawiam się, że Venryx jest niepoprawny. npm install nie czytać z package-lock.json. Aby odtworzyć, wykonaj następujące czynności. używając this package.json, uruchom npm install{... "devDependencies": {"sinon": "7.2.2"}} Teraz skopiuj / wklej package.jsoni package-lock.jsondo nowego katalogu. Zmień package.jsonna: „sinon”: „^ 7.2.2” uruchom npm 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.
zumafra
2
I nie tylko to, ale jeśli chcesz zrobić coś takiego, jak dodać kursor ^ package-lock.json, jedynym rozsądnym sposobem na to jest usunięcie package-lock.jsoni 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.jsonzmieni się tak samo na package-lock.jsonon npm install, ale dodanie karetki do zależności nie spowoduje tego samego package-lock.json.
zumafra
1
Pomyśl o package.jsonczymś, co możesz ręcznie zmodyfikować i package-lock.jsono czymś, czego nigdy ręcznie nie dotykasz. Zawsze kontrolujesz wersje OBIE pliki - szczególnie package-lock.json. Otwórz oba pliki, ręcznie edytuj nazwę projektu package.json, uruchom npm installi obserwuj, jak zmienia się nazwa projektu package-lock.json. licensenie wydaje się być zarejestrowany w package-lock.json.
zumafra
2
Plik @zumafra package-lock.json będzie używany podczas wykonywania npm ci, npm installpo prostu użyje pliku package.json, nawet jeśli plik blokady jest udostępniony
Xin
13

package-lock.jsonjest 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ści package.json.

Jeśli te wartości liczbowe w package.jsoni są package-lock.jsonzgodne, package-lock.jsonzostanie odczytane z.

Jeśli te wartości liczbowe w package.jsoni package-lock.jsonnie pasują do siebie, package-lock.jsonzostanie zapisane z tymi nowymi wartościami i nowymi modyfikatorami, takimi jak daszek i tylda, jeśli są obecne. Ale to cyfra powoduje zmianę na package-lock.json.

Aby zobaczyć, co mam na myśli, wykonaj następujące czynności. Używając package.jsonbez package-lock.json, uruchom npm installz:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json będzie teraz mieć:

"sinon": {
  "version": "7.2.2",

Teraz skopiuj / wklej oba pliki do nowego katalogu. Zmień package.jsonna (tylko dodając karetkę):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

biegnij npm install. Gdyby nie było package-lock.jsonpliku, zostałby zainstalowany [email protected]. npm installjest odczyt z package-lock.json i instalacji 7.2.2.

Teraz zmień package.jsonna:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

biegnij npm install. package-lock.jsonzostał napisany i pokaże teraz:

"sinon": {
  "version": "^7.3.0",
zumafra
źródło
7

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.

nflaig
źródło
4

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.

    {
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
  "version": "0.11.4",
  "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
  "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
  "dev": true,
  "requires": {
    "@angular-devkit/core": "7.1.4",
    "rxjs": "6.3.3"
  }
},

}

DIBYA RANJAN TRIPATHY
źródło
2

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.

user_ahmed
źródło
1
co się stanie, jeśli dostanę konflikt z tym plikiem?
Oliver Watkins,
0

package-lock.json: Zawiera dokładne informacje o wersji aktualnie zainstalowanej dla Twojej aplikacji.

Shubham Srivastava
źródło
1
Cześć i witam. Na to pytanie już udzielono odpowiedzi. Musisz sprawdzić, czy pytanie zostało oznaczone jako odpowiedź, sprawdzając, czy przed którąkolwiek z odpowiedzi znajduje się zielony przycisk.
Néstor