Niedawno zaktualizowałem do npm @ 5 . Mam teraz plik package-lock.json ze wszystkim z pliku package.json . Spodziewałbym się, że po uruchomieniu npm install
wersje zależności zostaną wyciągnięte z pliku blokady, aby określić, co powinno zostać zainstalowane w moim katalogu node_modules . Dziwne jest to, że w rzeczywistości modyfikuje i przepisuje mój plik package-lock.json .
Na przykład w pliku blokady określono maszynopis w wersji 2.1.6 . Następnie po npm install
poleceniu zmieniono wersję na 2.4.1 . Wydaje się, że pokonuje to cały cel pliku blokady.
czego mi brakuje? Jak mogę zmusić npm do respektowania mojego pliku blokady?
node.js
npm
npm-install
package-lock.json
Viper Bailey
źródło
źródło
package-lock.json
regeneruje się po uruchomieniunpm install
. Pachnie jak błąd npm. Czy korzystasz z własnego rejestru?--no-save
zapobiega zmianie pliku blokującego, ale nie wpływa na niemądre uaktualnianie zależności pierwszego poziomu, o którym wspomina PO.Odpowiedzi:
Aktualizacja 3: Jak wskazują inne odpowiedzi,
npm ci
polecenie zostało wprowadzone w npm 5.7.0 jako dodatkowy sposób na szybkie i powtarzalne kompilacje w kontekście CI. Więcej informacji znajduje się w dokumentacji i blogu npm .Aktualizacja 2: Problemem do aktualizacji i wyjaśnienia dokumentacji jest problem GitHub nr 18103 .
Aktualizacja 1: Zachowanie, które zostało opisane poniżej, zostało naprawione w npm 5.4.2: aktualnie planowane zachowanie jest opisane w numerze GitHub # 17979 .
Oryginalna odpowiedź: zachowanie programu
package-lock.json
zostało zmienione w npm 5.1.0, jak omówiono w numerze # 16866 . Zachowanie, które obserwujesz, jest najwyraźniej zamierzone przez npm od wersji 5.1.0.Oznacza to, że
package.json
może to zastąpićpackage-lock.json
za każdym razem, gdy zostanie znaleziona nowsza wersja dla zależności wpackage.json
. Jeśli chcesz skutecznie przypiąć swoje zależności, musisz teraz określić wersje bez prefiksu, np. Musisz je zapisać jako1.2.0
zamiast~1.2.0
lub^1.2.0
. Następnie kombinacjapackage.json
ipackage-lock.json
da powtarzalne kompilacje. Żeby było jasne:package-lock.json
sam nie blokuje już zależności poziomu root!To, czy ta decyzja projektowa była dobra, czy nie, jest dyskusyjne, toczy się dyskusja wynikająca z tego zamieszania na GitHubie w numerze 17979 . (Moim zdaniem jest to wątpliwa decyzja; przynajmniej nazwa
lock
nie jest już prawdą).Jeszcze jedna uwaga: istnieje również ograniczenie dla rejestrów, które nie obsługują niezmiennych pakietów, na przykład gdy pobierasz pakiety bezpośrednio z GitHub zamiast npmjs.org. Więcej informacji można znaleźć w tej dokumentacji blokad opakowań .
źródło
npm update
? : o Mam takie samo przeczucie, żenpm install
zaktualizowałem deps, ale nie chcę w to uwierzyć ... ale wydaje się, że to niestety prawda. W każdym razie nadal istnieje opcjanpm shrinkwrap
blokowania deps, ale zdecydowanie nazwa pakietu-lock jest niepoprawna ponieważ nie zamraża ani nie blokuje zależności.Odkryłem, że będzie nowa wersja npm 5.7.1 z nowym poleceniem
npm ci
, które będzie instalowaćpackage-lock.json
tylko zźródło
npm install
” przed uruchomieniem polecenianpm ci
w tym projekcie. Czy nienpm install
zastępuje pliku package-lock.json?npm
tylko plik blokady, jeśli jest to konieczne, aby spełnić specyfikację w Package.json . Więc jeśli pakiety mówiłythatpackage: 1
, a blokada mówi..: 1.0.4
, dev może edytować, aby powiedziećthatpackage: 2
- i to zmusi plik blokady do zmiany, ponieważ1.0.4
nie jest zgodny z nowo określonym zakresem. Jeśli się nie zmienipackages.json
, pozostanie zablokowany na dokładnej wersji, aż do usunięcia pliku blokady. [Jeśli nie pozostaje zamknięty i nie zmienia pliku Package.json, zgłoś raport o błędzie.]Użyj nowo wprowadzonego
Przedstawiamy
npm ci
szybsze, bardziej niezawodne kompilacjeźródło
npm ci
i tylkonpm install
wtedy, gdy aktualizujemy lub instalujemy nowe pakiety.node_modules
katalog i odbudowuje lokalnie, nawet jeśli jest to inaczej puste, ale ważne dowiązanie symboliczne. :(npm ci
, spodziewam się, że byliby bardzo niechętni do wprowadzenia czegokolwiek, co mogłoby obniżyć wydajność w dość rzadkim przypadku użycia. Możesz jednak sprawdzić stronę pnpm.js.org, która korzysta z twardych łączy w celu zmniejszenia zużycia dysku.Krótka odpowiedź:
npm install
honoruje pakiet-lock.json tylko wtedy, gdy spełnia wymagania określone w pakiecie.json.npm ci
.Oto scenariusz, który może wyjaśniać różne rzeczy (Verified with NPM 6.3.0)
Deklarujesz zależność w pakiecie.json jak:
Następnie zrobisz,
npm install
co wygeneruje pakiet-lock.json z:Kilka dni później zostaje wydana nowsza, mniejsza wersja „depA”, powiedzmy „1.1.0”, a następnie spełnione są następujące warunki:
Następnie ręcznie zaktualizuj plik package.json do:
Następnie uruchom ponownie:
źródło
npm install
użyje zablokowanych wersji,package-lock.json
chyba że nie spełnia warunków,package.json
w których to instaluje pakiet.json i odpowiednio przebudowuje pakiet-lock.json. Jeśli zmieniłeś swójpackage.json
w taki sposób, że istniejąca blokada pakietu nadal spełnia wymagania zaktualizowanej wersjipackage.json
, nadal będzie go używaćpackage-lock
npm install
nic nie robi, niezależnie od package-lock.json. Musimy jawnie aktualizować pakiety, nawet jeśli są dostępne aktualizacje, które pasują do semver określonego w package.json. Przynajmniej takie było moje doświadczenie od lat.node_modules
mieści się w zakresiepackage.json
i nie mapackage-lock.json
pliku, npm nie zaktualizuje modułu podczas działanianpm install
. Wydaje mi się, że jest w porządku, ponieważ można użyćnpm update
(lubnpm-check
najnowszej) do aktualizacji zależności, a to zachowanie jest szybsze w przypadku kogoś, kto po prostu dodaje jeden wpispackage.json
i nie chce, aby niepowiązane pakiety aktualizowały się do najnowszej wersji, która spełnia sem-ver zasięg.Użyj
npm ci
polecenia zamiastnpm install
.„ci” oznacza „ciągłą integrację”.
Zainstaluje zależności projektu na podstawie pliku package-lock.json zamiast łagodnych zależności pliku package.json.
Będzie produkować identyczne kompilacje z członkami twojej drużyny, a także jest znacznie szybszy.
Możesz przeczytać więcej na ten temat w tym poście na blogu: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable
źródło
ci
odnosi się do „ciągłej integracji”, jak wspomniano w dokumentach i poście na blogu, ogłaszając polecenie: blog.npmjs.org/post/171556855892/…node_modules
folder i odtworzy go od zera. Czy to naprawdę dużo szybsze? Czynpm install
usuwa takżenode_modules
folder?npm install
trzeba rozwiązać wszystkie zależności pakietu po uruchomieniu.npm ci
to tylko lista zakupów „pobierz te dokładne moduły”.W przyszłości będziesz mógł użyć
--from-lock-file
flagi (lub podobnej), aby zainstalować tylko z poziomupackage-lock.json
bez jej modyfikowania.Będzie to przydatne w środowiskach CI itp., W których ważne są odtwarzalne kompilacje.
Zobacz https://github.com/npm/npm/issues/18286 w celu śledzenia funkcji.
źródło
npm ci
która obsługuje również twoje pytanie.Wygląda na to, że ten problem został rozwiązany w npm v5.4.2
https://github.com/npm/npm/issues/17979
(Przewiń w dół do ostatniego komentarza w wątku)
Aktualizacja
Naprawiono w wersji 5.6.0. W wersji 5.4.2 wystąpił błąd wieloplatformowy, który powodował, że problem nadal występował.
https://github.com/npm/npm/issues/18712
Aktualizacja 2
Zobacz moją odpowiedź tutaj: https://stackoverflow.com/a/53680257/1611058
npm ci
to polecenie, którego powinieneś używać podczas instalowania istniejących projektów.źródło
npm i
. Na przykład modułfsevents
jest usuwany, gdy jestemnpm i
na komputerze, który nie obsługuje,fsevents
a następnie moduł jest ponownie dodawany, gdynpm i
ponownie na komputerze, który obsługuje.fsevents
spadek w moimpackage-lock.json
ze[email protected]
natomiast współpracuje z Mac OS X autorów. Jeśli nie otworzyłeś problemu, zrobię to.Prawdopodobnie masz coś takiego:
w twoim,
package.json
które npm aktualizuje do najnowszej mniejszej wersji, w twoim przypadku2.4.1
Więcej na
package-lock.json
:Pakiet-lock.json jest generowany automatycznie dla wszystkich operacji, w których npm modyfikuje drzewo modułów_węzła lub pakiet.json. Opisuje dokładnie wygenerowane drzewo, dzięki czemu kolejne instalacje mogą generować identyczne drzewa, niezależnie od pośrednich aktualizacji zależności.
Ten plik ma być przeznaczony do repozytoriów źródłowych i służy do różnych celów:
https://docs.npmjs.com/files/package-lock.json
źródło
package-lock.json
pobierany, a następnie uruchamianynpm install
, alepackage-lock.json
plik jest modyfikowany i musimy wykonać reset, zanim będziemy mogli pobrać kolejne zmiany.Prawdopodobnie powinieneś użyć czegoś takiego
Zamiast używać,
npm install
jeśli nie chcesz zmieniać wersji swojego pakietu.Zgodnie z oficjalną dokumentacją zarówno zainstalować , jak
npm install
inpm ci
zależności, które są potrzebne do projektu.źródło
Jest to otwarty problem na ich stronie github: https://github.com/npm/npm/issues/18712
Ten problem jest najpoważniejszy, gdy programiści używają różnych systemów operacyjnych.
źródło
EDYCJA: nazwa „lock” jest trudna, jej NPM próbuje dogonić Yarn. To nie jest zablokowany plik.
package.json
jest plikiem ustalonym przez użytkownika, który po zainstalowaniu wygeneruje drzewo folderów node_modules, a następnie zostanie zapisanepackage-lock.json
. Widzisz, jest na odwrót - wersje zależności będą pobieranepackage.json
jak zawsze ipackage-lock.json
powinny być wywoływanepackage-tree.json
(mam nadzieję, że to wyjaśniło moją odpowiedź po tylu opiniach)
Uproszczona odpowiedź: zachowaj
package.json
swoje zależności jak zwykle, podczas gdypackage-lock.json
jest to „dokładne i, co ważniejsze, odtwarzalne drzewo modułów_węzła” (zaczerpnięte z samej dokumentacji npm ).Co do podstępnej nazwy, jej NPM próbuje dogonić Yarn.
źródło