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?

Author: k0pernikus, 2017-05-30

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 gdy npm-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 publikowanie pakietu do npm, masz wybór między:

    1. 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 przez package.json lub
    2. 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.

 93
Author: Mark Amery,
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.

 19
Author: SeriousM,
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:

Https://www.reddit.com/r/javascript/comments/6dgnnq/npm_v500_released_save_by_default_lockfile_better/di3mjuk/

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

 11
Author: Cody Brumfield,
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