Jaka jest różnica między npm-shrinkwrap.json i package-lock.json?
Wraz z wydaniem npm@5, będzie teraz pisać package-lock.json
, chyba że npm-shrinkwrap.json
już istnieje.
Zainstalowałem npm@5 globalnie przez:
npm install npm@5 -g
I teraz, jeśli npm-shrinkwrap.json
zostanie znalezione podczas:
npm install
Zostanie wydrukowane Ostrzeżenie:
npm WARN read-shrinkwrap This version of npm
is compatible with lockfileVersion@1,
but npm-shrinkwrap.json was generated for lockfileVersion@0.
I'll try to do my best with it!
Więc moim wyjściem jest to, że powinienem zastąpić shrinkwrap package-lock.json
.
Dlaczego jednak istnieje nowy format? Co package-lock.json
może zrobić, że npm-shrinkwrap.json
nie może?
3 answers
Pliki mają dokładnie tę samą zawartość, ale istnieje kilka różnic w tym, jak npm je obsługuje, opisanych na stronie docs , a także w pliku docs w repo npm, który zaczyna się od jawnego adresowania różnicy między tymi dwoma plikami :
-
package-lock.json
nigdy nie jest publikowany w npm, podczas gdynpm-shrinkwrap
jest domyślnie -
package-lock.json
pliki, które nie znajdują się w pakiecie najwyższego poziomu są ignorowane, ale pliki shrinkwrap należące do Zależności są respected - Jest kompatybilna wstecznie z wersjami npm 2, 3 i 4, podczas gdy {[0] } jest rozpoznawana tylko przez npm 5+
Można przekonwertować istniejące package-lock.json
na npm-shrinkwrap.json
, uruchamiając npm shrinkwrap
.
Tak więc:
- jeśli nie publikujesz pakietu do npm, wybór pomiędzy tymi dwoma plikami ma niewielkie znaczenie. Możesz chcieć użyć
package-lock.json
, ponieważ jest to domyślne i jego nazwa jest jaśniejsza dla początkujących npm; alternatywnie możesz użyćnpm-shrinkwrap.json
dla kompatybilność wsteczna z npm 2-4, jeśli trudno jest zapewnić, że wszyscy z twojego zespołu programistów są na npm 5+. (Zauważ, że npm 5 został wydany 25th May 2017; kompatybilność wsteczna będzie coraz mniej ważna im dalej dostaniemy od tej daty, ponieważ większość ludzi będzie w końcu uaktualnić.) -
Jeśli są publikowanie pakietu do npm, masz wybór między:
- używanie
package-lock.json
do zapisywania dokładnie, które wersje zależności zainstalowane, ale pozwalając instalatorom na używanie dowolnej wersji zależności zgodnej z zakresami wersji dyktowanymi przezpackage.json
lub - używanie
npm-shrinkwrap.json
, aby zagwarantować, że każdy, kto zainstaluje Twój Pakiet, otrzyma dokładnie tę samą wersję wszystkich zależności
oficjalny widok opisany (bardzo zwięźle) w dokumentach jest taki, że opcja 1 powinna być używana dla bibliotek (prawdopodobnie w celu zmniejszenia ilości duplikacji pakietów spowodowane, gdy wiele zależności pakietu zależy od nieco różnych wersji tej samej zależności drugorzędnej), ale ta opcja 2 może być rozsądna dla plików wykonywalnych, które mają być zainstalowane globalnie. - używanie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 04:59:39
Wyjaśnienie od programisty NPM :
Pomysł jest zdecydowanie na package-lock.json być najnowszym i Największy w technologii shrinkwrap i npm-shrinkwrap.json to be zarezerwowane dla tych niewielu ludzi, którym bardzo zależy o swoich bibliotekach zawierających dokładnie node_modules. dla osób kto chce CI za pomocą npm@ > =2 zainstalować konkretne drzewo bez konieczności aby podbić jego wersję npm.
Nowy lockfile ("pakiet-blokada.json") akcje w zasadzie wszystkie ten sam kod, dokładnie taki sam format jak npm-shrinkwrap (można zmienić nazwę między sobą!). Jest to również coś, co społeczność wydaje się zrozumieć:" ma lockfile " wydaje się klikać o wiele szybciej z osób. Wreszcie, posiadanie nowego pliku oznaczało, że możemy mieć stosunkowo niskie ryzyko-kompat z shrinkwrap bez konieczności robienia dziwnych rzeczy takie jak allow-publication wspomniane w poście nadrzędnym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-02 08:17:45
Myślę, że chodziło o to, aby --save i shrinkwrap miały miejsce domyślnie, ale unikały potencjalnych problemów z shrinkwrap, które miały miejsce tam, gdzie nie były pożądane. Więc po prostu nadali mu nową nazwę pliku, aby uniknąć konfliktów. Ktoś z npm wyjaśnił to dokładniej tutaj:
Odpowiedni cytat:
Npm publikuje większość plików w Twoim źródle katalog domyślnie, oraz ludzie od lat publikują shrinkwraps. Nie chcieliśmy złamać kompatybilność. Z --save i shrinkwrap domyślnie, było duże ryzyko, że przypadkowo trafi do środka i rozmnaża się przez rejestru, a w zasadzie renderujemy naszą możliwość aktualizacji deps i dedupe... null.
Więc wybraliśmy nową nazwę. I wybraliśmy nową nazwę. nagle. Nowy lockfile dzieli się w zasadzie wszystkim tym samym kodem, dokładnie to samo format
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-02 15:21:33