• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

NPM - doprecyzowanie tego co się dzieje gdy uruchamiamy komendę npm install

Object Storage Arubacloud
+3 głosów
487 wizyt
pytanie zadane 25 lipca 2021 w JavaScript przez Artek Stary wyjadacz (11,800 p.)
Trochę ostatnio poczytałem o plikach package.json i package.lock.json. Chciałbym się upewnić, że dobrze rozumiem zastosowanie tych plików i tego co się dzieje gdy uruchamiamy komendę "npm install", trochę poczytałem na ten temat i mam wrażenie, że gdzie niegdzie są sprzeczne informacje. Chodzi mi o najnowszą wersję npm'a. Ja rozumiem to tak :

Po uruchomieniu "npm install" jeżeli istnieje plik package.lock.json npm instaluje dokładnie tą wersję jaka jest zapisana w pliku package.lock.json. Ponadto, jeżeli package.lock.json istnieje i w pliku package.json dodamy zapis typu "some_package" : ^2.1.2 to "some_package" nie zostanie zainstalowany bo w package.lock.json tego nie ma. Aby zainstalować "some_package" trzeba by użyć komendy : npm install some_package.

 

Jeżeli plik package.lock.json nie istnieje to npm pobierze wersje paczek takie jakie są zapisane w package.json z uwzględnieniem znaków typu ^ oraz ~ i wtedy wygeneruje plik package.lock.json.

Czy dobrze to rozumiem i czy najnowsze wersje npm'a tak działają jak opisałem?

1 odpowiedź

+9 głosów
odpowiedź 25 lipca 2021 przez niezalogowany
wybrane 27 lipca 2021 przez Artek
 
Najlepsza

`npm install` instaluje paczki podane w packajge.json. Paczki tam podane mają swoje zależności, te paczki mają swoje zależności, a te paczki znowu mają swoje zależności itd... Kończymy instalację z wielkim node_modules w którym ściągnięte są wszystkie zależności do każdej zależności.

Problem polega na tym, że definiujemy tylko wersje głównych zależności, a zależności zależności instalują się za każdym razem "najnowsze". Gdy autorzy dowolnej paczki nie przestrzegają zasad semver zazwyczaj robi się spory bałagan na różnch środowiskach. Stąd powstał pomysł aby zapisać gdzieś dokładnie, jaką wersję ma każda zależność. W ten sposób każdy build byłby powtarzalny. Miejscem zapisu tych wersji jest package-lock.json i jest on generowany za każdym razem, gdy robimy npm install. Aby zainstalować zależności z package-lock.json należy wykonać komendę npm ci

npm ci służy głównie do Continous Delivery (gdzie powtarzalne buildy mają ogromne znacznie) oraz instalacji zależności gdy wchodzimy do projektu

komentarz 26 lipca 2021 przez Artek Stary wyjadacz (11,800 p.)
edycja 26 lipca 2021 przez Artek

Problem polega na tym, że definiujemy tylko wersje głównych zależności, a zależności zależności instalują się za każdym razem "najnowsze"

Ale jak to? Twórcy paczek nie podają jakiej wersji danej zależności wymaga ich paczka? Co masz na myśli pisząc w cudzysłowie "najnowsze" ? 

2
komentarz 27 lipca 2021 przez niezalogowany

Wersję paczki można zdefiniować na wiele sposopów.

Domyślnie przy instalacji jest dodawana wersja z prefixem ^ to jest informacja: zainstaluj najnowszą wersję kompatybilną z obecną wersją major zapisaną w package.json

Na przykład zapis w package.json: "lodash": "^4.0.0" zainstaluje (teraz) lodasha w wersji 4.17.21, ale za miesiąc? kto wie?

 

"Najnowsze" w cudzysłowie znalazło się z w dwóch powodów:

1. Jeśli dana paczka ma już większą wersję major, to nie zainstaluje tej najnowszej, tylko najnowszą kompatybilną

2. Autor paczki może zmienić znak ^ i ustawić wersje zależności według własnego zapotrzebowania. W tym przypadku znów nie będą one najnowsze
 

komentarz 27 lipca 2021 przez Artek Stary wyjadacz (11,800 p.)
Znaczenie znaczków i wersji paczek jest dla mnie zrozumiałe. Czyli ja rozumiem, że zarówno zależności definiowane bezpośrednio w package.json jak i zależności zależności są definiowane przy pomocy wspomnianych znaczków(np. ^ , ~) i liczb w formacie np. 1.2.3 . Gdy wywołujemy npm install zawsze generowany jest plik package.lock.json gdzie podane są konkretne wersje paczek. Zależności jak i zależności zależności są instalowane z uwzględnieniem prawideł rządzących konkretnymi znaczkami.
komentarz 29 lipca 2021 przez Artek Stary wyjadacz (11,800 p.)

@niezalogowany, Rozumiem, że w ostatnim komentarzu nic nie pomieszałem i można zaakceptować takie wyjaśnienie.

1
komentarz 30 lipca 2021 przez niezalogowany

Tak, ale jeszcze dla pewności doprecyzuję:

npm install schodząc w dół drzewka zależności instaluje paczki według prawideł opisu wersji. Na sam koniec zapisuje do package-lock.json konkretne wersje wszystkich paczek jakie zainstalował.

package-lock.json jest później wykorzystywany tylko przez npm ci

package-lock.json nie ma żadnego wpływu na npm install

package-lock.json powinien być commitowany do repozytorium

npm ci powinien być wykorzystywany za każdym razem, gdy to możliwe

w package-lock.json zapisywane są też inne meta-dane niż wersja paczki

komentarz 31 lipca 2021 przez Artek Stary wyjadacz (11,800 p.)
@niezalogowany

Super, dzięki za obszerne wyjaśnienia.

Podobne pytania

0 głosów
1 odpowiedź 327 wizyt
pytanie zadane 19 października 2016 w HTML i CSS przez Madar Obywatel (1,560 p.)
+1 głos
1 odpowiedź 987 wizyt
pytanie zadane 14 czerwca 2019 w JavaScript przez Marchiew Dyskutant (7,690 p.)
0 głosów
2 odpowiedzi 338 wizyt
pytanie zadane 20 stycznia 2018 w Inne języki przez SandraS Obywatel (1,400 p.)

92,555 zapytań

141,402 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...