• 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

+4 głosów
137 wizyt
pytanie zadane 25 lipca 2021 w JavaScript przez Artek Stary wyjadacz (11,760 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 argeento VIP (109,260 p.)
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,760 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 argeento VIP (109,260 p.)

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
 

1
komentarz 27 lipca 2021 przez Artek Stary wyjadacz (11,760 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,760 p.)

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

1
komentarz 30 lipca 2021 przez argeento VIP (109,260 p.)

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,760 p.)
@argeento

Super, dzięki za obszerne wyjaśnienia.

Podobne pytania

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

86,541 zapytań

135,291 odpowiedzi

300,649 komentarzy

57,288 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...