instalacja npm vs. aktualizacja - jaka jest różnica?


519

Jaka jest praktyczna różnica między npm installi npm update? Kiedy powinienem użyć które?

Odpowiedzi:


654

Różnica między instalacją npm a obsługą aktualizacji npm dla wersji pakietu określonych w package.json :

{
  "name":          "my-project",
  "version":       "1.0",                             // install   update
  "dependencies":  {                                  // ------------------
    "already-installed-versionless-module":  "*",     // ignores   "1.0" -> "1.1"
    "already-installed-semver-module":       "^1.4.3" // ignores   "1.4.3" -> "1.5.2"
    "already-installed-versioned-module":    "3.4.1"  // ignores   ignores
    "not-yet-installed-versionless-module":  "*",     // installs  installs
    "not-yet-installed-semver-module":       "^4.2.1" // installs  installs
    "not-yet-installed-versioned-module":    "2.7.8"  // installs  installs
  }
}

Podsumowanie : jedyną dużą różnicą jest to, że już zainstalowany moduł z rozmytą wersją ...

  • zostaje zignorowany przez npm install
  • zostanie zaktualizowany przez npm update

Dodatkowo : installi updatedomyślnie obsługujemy devDependencies w różny sposób

  • npm installbędzie instalacja / aktualizacja devDependencies chyba że --productionflaga jest dodawany
  • npm updatebędzie ignorować devDependencies chyba że --devflaga jest dodawany

Po npm installco w ogóle korzystać?

Ponieważ npm installrobi więcej, gdy spojrzysz poza obsługą swoich zależności package.json. Jak widać w instalacji npm , możesz ...

  • ręcznie zainstaluj moduły węzłów
  • ustaw je jako globalne (co umieszcza je w powłoce PATH) za pomocąnpm install -g <name>
  • zainstaluj niektóre wersje opisane przez tagi git
  • zainstaluj z adresu git
  • wymusić ponowną instalację za pomocą --force

20
i co ~1.3?
Offirmo

6
co jeśli wersja jest ^ 5.0.9? Czy można npm install --save somePackagezapisać * w zależnościach?
KwiZ

5
Chciałbym również zauważyć, że skrypty takie jak postinstalluruchamiane przy instalacji, ale nie przy aktualizacji.
Michael Marvick

2
Jeśli installi updatedziałają inaczej na adresy URL git, tagi git itp. Określone w package.jsonwtedy, byłoby dobrze dodać te przypadki do przykładu.
joeytwiddle

2
@Offirmo tylda w rozmytej wersji oznacza „aktualizacja do najnowszej wersji mniejszej (poprawka) tego pakietu”, przy czym wersja podrzędna jest ostatnim numerem w wersji, tj. 1.3.0 -> 1.3.1Jest to podobne do tego ^1.3.0, w którym ^aktualizacje główne, tj 1.3.0 -> 1.4.0.
Boyan Kushlev

82

Instalacja npm instaluje wszystkie moduły wymienione w package.jsonpliku i ich zależności.

Aktualizacja npm aktualizuje wszystkie pakiety w node_moduleskatalogu i ich zależności.

npm install express instaluje tylko moduł express i jego zależności.

npm update express updates moduł ekspresowy (zaczynając od npm@2.x, nie aktualizuje swoich zależności).

Tak więc aktualizacje są dostępne, gdy masz już moduł i chcesz uzyskać nową wersję.


5
jeśli nie określisz konkretnej wersji w pliku package.json, npm install otrzyma najnowszą wersję modułu. To rodzaj aktualizacji.
saeed

11
Więc czego powinienem użyć npm installlub npm update? Innymi słowy, teraz używam npm installi wydaje się, że także aktualizuje, czy jest jakiś powód, dla którego powinienem kiedykolwiek używać npm update?
Borek Bernard

4
Czy updatezawsze będzie aktualizować do najnowszej wersji, niezależnie od pliku package.json, a jednocześnie installbędzie przestrzegać wersji podanej w pakiecie.json?
Borek Bernard,

1
updateinstaluje (lub aktualizuje) najnowszą wersję modułu. installinstaluje najnowszą wersję modułu, jeśli jej nie zaprezentowano, w przeciwnym razie zachowuje aktualną wersję.
tenphi

11
@Borek npm updatezaktualizuje się do najnowszej wersji na podstawie pliku package.json, niezależnie od tego. Jeśli masz „express”: „3.x” i korzystasz z wersji 3.1.0, zaktualizuje się do najnowszego znacznika 3.x. Jeśli dostępna jest wersja 4.x, nie zostanie ona zainstalowana najnowsza.
gcochard

47

W większości przypadków spowoduje to zainstalowanie najnowszej wersji modułu opublikowanej na npm.

npm install express --save

lub lepiej zaktualizować moduł do najnowszej wersji:

npm install express@latest --save --force

--save: Pakiet pojawi się w twoich zależnościach.

Więcej informacji: npm-install


11
npm install express@latest --save --forcebyło dokładnie to, czego chciałem.
ThomasReggi

2
W większości przypadków? Jakieś inne przypadki?
Dmitri Zaitsev

9

Wiele wyróżnień zostało już wspomnianych. Oto jeszcze jeden:

Uruchomiony npm installw górnej części katalogu źródłowego będzie działać różne scenariusze: prepublish, preinstall, install, postinstall. W zależności od tego, co robią te skrypty, a npm installmoże wykonać znacznie więcej pracy niż instalacja zależności.

Właśnie miałem przypadek użycia, w którym prepublishzadzwonił, makei Makefilezostał zaprojektowany do pobierania zależności, jeśli package.jsonzostał zaktualizowany. Wywoływanie npm installz wewnątrz Makefiledoprowadziłoby do nieskończonej rekurencji, podczas gdy wywoływanie npm updatedziałało dobrze, instalując wszystkie zależności, aby kompilacja mogła być kontynuowana, nawet gdyby makezostała wywołana bezpośrednio.


1
Jedną z implikacji jest to, że jeśli zaktualizujesz na przykład redismoduł i other_modulewymaga on starszej wersji redis, npm install other_modulezagwarantuje, że other_moduleużyje starszej wersji. Może dodać w other_module/node_modules/redisrazie potrzeby.
jlukanta,

4

npm update: zainstaluj i zaktualizuj za pomocą najnowszych modułów węzłów znajdujących się w pliku package.json

npm install: zainstaluj moduły węzłów zdefiniowane w pliku package.json (bez aktualizacji)


Korzystając z npm w wersji 6.9.0, obserwuję następujące zachowanie: pominę npm updatedużą liczbę zależności w package-lock.json. Aby mieć wszystkie wymagane pakiety dostępne i package-lock.jsonbyć poprawnym, zawsze muszę wykonać npm installzaraz po npm update.
Manfred,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.