Odpowiedzi:
Z dokumentów npm :
Krótko mówiąc, główne różnice między używaniem instalacji npm i npm ci to:
- Projekt musi mieć istniejący pakiet-lock.json lub npm-shrinkwrap.json.
- Jeśli zależności w blokadzie pakietu nie pasują do zależności w pakiecie.json, npm ci zakończy działanie z błędem, zamiast aktualizować blokadę pakietu.
- npm ci może instalować tylko całe projekty naraz: nie można dodawać indywidualnych zależności za pomocą tego polecenia.
- Jeśli moduł node_modules jest już obecny, zostanie on automatycznie usunięty, zanim npm ci rozpocznie instalację.
- Nigdy nie napisze w paczce.json ani w żadnej z blokad pakietów: instalacje są zasadniczo zawieszone.
Zasadniczo
npm installczyta, package.jsonaby utworzyć listę zależności i używa package-lock.jsondo poinformowania, które wersje tych zależności należy zainstalować. Jeśli nie ma zależności package-lock.json, zostanie dodana przeznpm install .
npm ci(nazwany C ciągłe I ntegration) instaluje się bezpośrednio z zależnościami package-lock.jsoni zastosowań package.jsontylko, aby potwierdzić, że nie istnieją wersje niedopasowane. Jeśli brakuje jakichkolwiek zależności lub mają one niezgodne wersje, wygeneruje błąd .
Służy npm installdo dodawania nowych zależności i aktualizowania zależności od projektu. Zwykle używasz go podczas programowania po wyciągnięciu zmian aktualizujących listę zależności, ale npm ciw tym przypadku dobrym pomysłem może być użycie .
Użyj, npm cijeśli potrzebujesz deterministycznej, powtarzalnej kompilacji. Na przykład podczas ciągłej integracji, automatycznych zadań itp. Oraz podczas instalowania zależności po raz pierwszy zamiast npm install.
npm installnpm-shrinkwrap.jsoni package-lock.json(w tej kolejności).node_modules.package.jsonlub package-lock.json.
npm i packagename) może pisać package.jsondo dodania lub aktualizacji zależności.npm i) może napisać, aby package-lock.jsonzablokować wersję niektórych zależności, jeśli nie ma ich już w tym pliku.npm cipackage-lock.jsonlub npm-shrinkwrap.jsonmusi być obecny.package.json.node_modulesi instaluje wszystkie zależności jednocześnie.package.jsonlub package-lock.json.Podczas gdy npm cigeneruje całe drzewo zależności z package-lock.jsonlub npm-shrinkwrap.json, npm install aktualizuje zawartośćnode_modules przy użyciu następującego algorytmu ( źródła ):
load the existing node_modules tree from disk clone the tree fetch the package.json and assorted metadata and add it to the clone walk the clone and add any missing dependencies dependencies will be added as close to the top as is possible without breaking any other modules compare the original tree with the cloned tree and make a list of actions to take to convert one to the other execute all of the actions, deepest first kinds of actions are install, update, remove and move
npm install packagemogli modyfikować zarówno package-lock.json a package.json , natomiast npm installwhithout argumenty by tylko modyfikowaćpackage-lock.json
npm ciusunie każdy istniejący folder node_modules i polega na package-lock.jsonpliku, aby zainstalować określoną wersję każdego pakietu. Jest znacznie szybszy niż instalacja npm, ponieważ pomija niektóre funkcje. Instalacja w stanie czystym jest świetna dla rurociągów ci / cd i kompilacji dokerów! Używasz go również do instalacji wszystkiego naraz, a nie konkretnych pakietów.
Dokumentacja, którą podłączyłeś, miała podsumowanie:
Krótko mówiąc, główne różnice między używaniem instalacji npm i npm ci to:
- Projekt musi mieć istniejący pakiet-lock.json lub npm-shrinkwrap.json.
- Jeśli zależności w blokadzie pakietu nie pasują do zależności w pakiecie.json, npm ci zakończy działanie z błędem, zamiast aktualizować blokadę pakietu.
- npm ci może instalować tylko całe projekty naraz: nie można dodawać indywidualnych zależności za pomocą tego polecenia.
- Jeśli moduł node_modules jest już obecny, zostanie on automatycznie usunięty, zanim npm ci rozpocznie instalację.
- Nigdy nie napisze w paczce.json ani w żadnej z blokad pakietów: instalacje są zasadniczo zawieszone.
Polecenia mają bardzo podobną funkcjonalność, jednak różnica polega na podejściu zastosowanym do zainstalowania zależności określonych w plikach package.jsoni package-lock.json.
npm ciwykonuje czystą instalację wszystkich zależności aplikacji, ale npm installmoże pominąć niektóre instalacje, jeśli już istnieją w systemie. Problem może powstać, jeśli wersja już zainstalowana w systemie nie package.jsonjest wersją, którą zamierzasz zainstalować, tj. Zainstalowana wersja różni się od wersji „ wymaganej ”.
Inne różnice to takie, które npm cinigdy nie dotykają twoich package*.jsonplików. Zatrzyma instalację i wyświetli błąd, jeśli wersje zależności nie będą zgodne w plikach package.jsoni package-lock.json.
Możesz przeczytać o wiele lepsze wyjaśnienie z oficjalnych dokumentów tutaj .
Dodatkowo, może chcesz przeczytać o zamkach pakiet tutaj .
Warto pamiętać, że obrazy dokerów lekkich węzłów, takie jak alpine, nie mają zainstalowanego Pythona, z którego zależności node-gypkorzysta npm ci.
Myślę, że jest nieco uważane, że aby npm cidziałać, musisz zainstalować Pythona jako zależność w swojej kompilacji.
Więcej informacji tutaj Docker i npm - gyp ERR! nie w porządku
Powinieneś ich używać w różnych sytuacjach.
npm installjest świetny do programowania i do CI, gdy chcesz buforować node_moduleskatalog. Kiedy tego użyć? Możesz to zrobić, jeśli tworzysz pakiet dla innych osób (NIE dołączasz go node_modulesdo takiego wydania) . Jeśli chodzi o buforowanie, należy zachować ostrożność, jeśli planowane jest obsługiwanie różnych wersji Node.jspamięci, które node_modulesmogą wymagać ponownej instalacji ze względu na różnice między Node.jswymaganiami środowiska wykonawczego. Jeśli chcesz trzymać się jednej wersji, trzymaj się najnowszej LTS.
npm cipowinien być używany, gdy chcesz przetestować i wydać aplikację produkcyjną (produkt końcowy, nie może być używany przez inne pakiety), ponieważ ważne jest, aby instalacja była jak najbardziej deterministyczna, instalacja potrwa dłużej, ale ostatecznie spowoduje Twoja aplikacja jest bardziej niezawodna (dołączasz do node_modulestakiej wersji) . Trzymaj się LTSwersji Node.js.
Bonus: Możesz je mieszać w zależności od tego, jak skomplikowany chcesz to zrobić. W gałęziach funkcji w gitpamięci podręcznej node_modulesmożna zwiększyć wydajność zespołów, a żądanie scalenia i gałęzie główne polegają na npm cideterministycznym wyniku.
npm installnapisać do package.json. Czy wiesz, co mógłby tu napisać?