npm @ 5 został opublikowany, ma nową funkcję pakiet-lock.json (po npm install
), która mnie myli. Chcę wiedzieć, jaki jest efekt tego pliku?
npm @ 5 został opublikowany, ma nową funkcję pakiet-lock.json (po npm install
), która mnie myli. Chcę wiedzieć, jaki jest efekt tego pliku?
Odpowiedzi:
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 jak 1.2.3
zamiast 1.2.*
w twoim package.json
pliku.
npm ci
as, npm install
które zaktualizuje pakiet-lock.json, podczas gdy ci używa jego zawartości. Tylko dzięki npm 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 systemie package.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 razem npm 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, wykonaj npm ci
(który przeczyta plik blokady i zainstaluje całe drzewo pakietów)
package-lock.json
pliku. Po prostu instaluje się package.json
tak jak kiedyś. Aby skorzystać z package-lock.json
pliku, musisz użyć nowej komendy „npm ci”, która zainstaluje dokładne wersje wymienione w package-lock.json
zamiast zakresów wersji podanych w package.json
.
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.json
i package-lock.json
do nowego katalogu. Zmień package.json
na: „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.
package-lock.json
, jedynym rozsądnym sposobem na to jest usunięcie package-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 na package-lock.json
on npm install
, ale dodanie karetki do zależności nie spowoduje tego samego package-lock.json
.
package.json
czymś, co możesz ręcznie zmodyfikować i package-lock.json
o 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 install
i obserwuj, jak zmienia się nazwa projektu package-lock.json
. license
nie wydaje się być zarejestrowany w package-lock.json
.
npm ci
, npm install
po prostu użyje pliku package.json, nawet jeśli plik blokady jest udostępniony
package-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ści package.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
i package-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ę na package-lock.json
.
Aby zobaczyć, co mam na myśli, wykonaj następujące czynności. Używając package.json
bez package-lock.json
, uruchom npm install
z:
{
"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.json
na (tylko dodając karetkę):
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.2.2"
}
}
biegnij npm install
. Gdyby nie było package-lock.json
pliku, zostałby zainstalowany sinon@7.3.0. npm install
jest odczyt z package-lock.json
i instalacji 7.2.2.
Teraz zmień package.json
na:
{
"name": "test",
"version": "1.0.0",
...
"devDependencies": {
"sinon": "^7.3.0"
}
}
biegnij npm install
. package-lock.json
został napisany i pokaże teraz:
"sinon": {
"version": "^7.3.0",
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.
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"
}
},
}
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.
package-lock.json: Zawiera dokładne informacje o wersji aktualnie zainstalowanej dla Twojej aplikacji.