• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+3 głosów
693 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ź 397 wizyt
pytanie zadane 19 października 2016 w HTML i CSS przez Madar Obywatel (1,560 p.)
+1 głos
1 odpowiedź 1,196 wizyt
pytanie zadane 14 czerwca 2019 w JavaScript przez Marchiew Dyskutant (7,730 p.)
0 głosów
2 odpowiedzi 475 wizyt
pytanie zadane 20 stycznia 2018 w Inne języki przez SandraS Obywatel (1,400 p.)

93,103 zapytań

142,077 odpowiedzi

321,575 komentarzy

62,445 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...