Pracuję z ciągłą integracją i odkryłem polecenie npm ci .
Nie mogę zrozumieć, jakie są zalety korzystania z tego polecenia w moim przepływie pracy.
Czy to jest szybsze? Czy to sprawia, że test jest trudniejszy?
źródło
Pracuję z ciągłą integracją i odkryłem polecenie npm ci .
Nie mogę zrozumieć, jakie są zalety korzystania z tego polecenia w moim przepływie pracy.
Czy to jest szybsze? Czy to sprawia, że test jest trudniejszy?
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
napisać do package.json. Czy wiesz, co mógłby tu napisać?npm install package
mogli modyfikować zarównopackage-lock.json
apackage.json
, natomiastnpm install
whithout argumenty by tylko modyfikowaćpackage-lock.json
npm ci
usunie każdy istniejący folder node_modules i polega napackage-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.źródło
Dokumentacja, którą podłączyłeś, miała podsumowanie:
źródło
Polecenia mają bardzo podobną funkcjonalność, jednak różnica polega na podejściu zastosowanym do zainstalowania zależności określonych w plikach
package.json
ipackage-lock.json
.npm ci
wykonuje czystą instalację wszystkich zależności aplikacji, alenpm install
może pominąć niektóre instalacje, jeśli już istnieją w systemie. Problem może powstać, jeśli wersja już zainstalowana w systemie niepackage.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ą twoichpackage*.json
plików. Zatrzyma instalację i wyświetli błąd, jeśli wersje zależności nie będą zgodne w plikachpackage.json
ipackage-lock.json
.Możesz przeczytać o wiele lepsze wyjaśnienie z oficjalnych dokumentów tutaj .
Dodatkowo, może chcesz przeczytać o zamkach pakiet tutaj .
źródło
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
korzystanpm 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
źródło
Podczas gdy wszyscy inni odpowiedzieli na różnice techniczne, nikt nie wyjaśnia, w jakich sytuacjach użyć obu.
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 gonode_modules
do takiego wydania) . Jeśli chodzi o buforowanie, należy zachować ostrożność, jeśli planowane jest obsługiwanie różnych wersjiNode.js
pamięci, którenode_modules
mogą wymagać ponownej instalacji ze względu na różnice międzyNode.js
wymaganiami środowiska wykonawczego. Jeśli chcesz trzymać się jednej wersji, trzymaj się najnowszejLTS
.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 donode_modules
takiej wersji) . Trzymaj sięLTS
wersjiNode.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ęcznejnode_modules
można zwiększyć wydajność zespołów, a żądanie scalenia i gałęzie główne polegają nanpm ci
deterministycznym wyniku.źródło