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 install
czyta, package.json
aby utworzyć listę zależności i używa package-lock.json
do 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.json
i zastosowań package.json
tylko, 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 install
do 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 ci
w tym przypadku dobrym pomysłem może być użycie .
Użyj, npm ci
jeś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 install
npm-shrinkwrap.json
i package-lock.json
(w tej kolejności).node_modules
.package.json
lub package-lock.json
.
npm i packagename
) może pisać package.json
do dodania lub aktualizacji zależności.npm i
) może napisać, aby package-lock.json
zablokować wersję niektórych zależności, jeśli nie ma ich już w tym pliku.npm ci
package-lock.json
lub npm-shrinkwrap.json
musi być obecny.package.json
.node_modules
i instaluje wszystkie zależności jednocześnie.package.json
lub package-lock.json
.Podczas gdy npm ci
generuje całe drzewo zależności z package-lock.json
lub 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 package
mogli modyfikować zarówno package-lock.json
a package.json
, natomiast npm install
whithout argumenty by tylko modyfikowaćpackage-lock.json
npm ci
usunie każdy istniejący folder node_modules i polega na package-lock.json
pliku, 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.json
i package-lock.json
.
npm ci
wykonuje czystą instalację wszystkich zależności aplikacji, ale npm install
może pominąć niektóre instalacje, jeśli już istnieją w systemie. Problem może powstać, jeśli wersja już zainstalowana w systemie nie package.json
jest wersją, którą zamierzasz zainstalować, tj. Zainstalowana wersja różni się od wersji „ wymaganej ”.
Inne różnice to takie, które npm ci
nigdy nie dotykają twoich package*.json
plików. Zatrzyma instalację i wyświetli błąd, jeśli wersje zależności nie będą zgodne w plikach package.json
i 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-gyp
korzysta npm ci
.
Myślę, że jest nieco uważane, że aby npm ci
dział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 install
jest świetny do programowania i do CI, gdy chcesz buforować node_modules
katalog. Kiedy tego użyć? Możesz to zrobić, jeśli tworzysz pakiet dla innych osób (NIE dołączasz go node_modules
do takiego wydania) . Jeśli chodzi o buforowanie, należy zachować ostrożność, jeśli planowane jest obsługiwanie różnych wersji Node.js
pamięci, które node_modules
mogą wymagać ponownej instalacji ze względu na różnice między Node.js
wymaganiami środowiska wykonawczego. Jeśli chcesz trzymać się jednej wersji, trzymaj się najnowszej LTS
.
npm ci
powinien 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_modules
takiej wersji) . Trzymaj się LTS
wersji Node.js
.
Bonus: Możesz je mieszać w zależności od tego, jak skomplikowany chcesz to zrobić. W gałęziach funkcji w git
pamięci podręcznej node_modules
można zwiększyć wydajność zespołów, a żądanie scalenia i gałęzie główne polegają na npm ci
deterministycznym wyniku.
npm install
napisać do package.json. Czy wiesz, co mógłby tu napisać?