Чим відрізняється npm-shrinkwrap.json від пакета-lock.json?


158

З випуском npm @ 5 він тепер запише a, package-lock.jsonякщо npm-shrinkwrap.jsonвже не існує.

Я встановив npm @ 5 у всьому світі через:

npm install npm@5 -g

А тепер, якщо npm-shrinkwrap.jsonпід час виявлення a :

npm install

буде надруковано попередження:

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!

Тож мій винос полягає в тому, що я повинен замінити термоусадку на package-lock.json.

І все ж чому існує новий формат для нього? Що package-lock.jsonробити, що npm-shrinkwrap.jsonне може?

Відповіді:


176

Файли мають абсолютно однаковий вміст, але є кілька відмінностей у тому, як npm обробляє їх, описані на сайті docs, а також у файлі документів у репортажі npm, який починається з явного усунення різниці між цими двома файлами :

  • package-lock.jsonніколи не публікується до npm, тоді npm-shrinkwrapяк за замовчуванням
  • package-lock.json файли, які не містяться в пакеті верхнього рівня, ігноруються, але файли скорочення, що належать до залежностей, дотримуються
  • npm-shrinkwrap.jsonє сумісним назад із версіями npm 2, 3 та 4, тоді package-lock.jsonяк розпізнається лише npm 5+

Ви можете перетворити наявне package-lock.jsonв те npm-shrinkwrap.json, запустивши npm shrinkwrap.

Таким чином:

  • Якщо ви не публікуєте свій пакет в npm, вибір між цими двома файлами має мало наслідків. Ви можете скористатись package-lock.jsonтим, що це за замовчуванням, а його ім'я чіткіше для початківців npm; Ви також можете скористатись npm-shrinkwrap.jsonзворотною сумісністю з npm 2-4, якщо вам важко переконатися, що всі члени вашої команди розробників працюють у npm 5+. (Зверніть увагу, що npm 5 було випущено 25 травня 2017 року; сумісність ззаду стає все менш важливою, чим далі ми отримаємо з цієї дати, оскільки більшість людей згодом оновлять.)
  • Якщо будуть публікувати свій пакет в НПМ, у вас є вибір між:

    1. використовуючи для того, package-lock.jsonщоб точно записувати встановлені вами версії залежностей, але дозволяючи людям, що встановлюють ваш пакет, використовувати будь-яку версію залежностей, сумісну з діапазонами версій, продиктованими вашими package.json, або
    2. використовуючи npm-shrinkwrap.jsonгарантію, що кожен, хто встановлює ваш пакет, отримує абсолютно таку ж версію всіх залежностей


    Офіційний погляд, описаний (дуже коротко) в документах, полягає в тому, що варіант 1 повинен використовуватися для бібліотек (імовірно, щоб зменшити кількість дублювання пакетів, викликане, коли багато залежностей пакета залежать від трохи різних версій тієї ж вторинної залежності) , але цей варіант 2 може бути розумним для виконуваних файлів, які збираються встановити в усьому світі.


2
+1 - Ви можете уточнити свою другу точку кулі? У чому полягає відмінність між такою поведінкою та наявністю обертового скорочення?
Rhys

2
@Rhys друга куля на практиці не матиме значення, якщо ти не робиш щось дивне. В основному, це просто говорить , що якщо бібліотека яким - то чином зробив опублікувати package-lock.json(що неможливо), то , якщо ви повинні були встановити цю бібліотеку в якості залежності який - або інший пакет, то бібліотеки package-lock.jsonбудуть ігноруватися НПМ. Однак якщо бібліотека публікує npm-shrinkwrap.jsonі ви встановлюєте бібліотеку як залежність, ви також встановите як вторинні залежності точні версії всіх залежностей, зазначених у бібліотеці npm-shrinkwrap.json.
Марк Амері

Чи можете ви додати, що npm ciіснує, щоб забезпечити встановлення функції "лише package-lock.jsonдля читання". ( npm installвимкнення package-lock.jsonспричиненої плутанини та потенційних помилок і не скористається самим package-lock.jsonсобою.)
k0pernikus

@ k0pernikus Я не думаю, що існує різниця між тим, як npm ciобробляється, npm-shrinkwrap.jsonі package-lock.json- яке значення має це питання щодо різниці між двома файлами? Крім того, почитавши: Я думаю, що " npm install... не користується перевагою package-lock.json" було помилковим з npm 5.4 - я вважаю, що npm installзараз поважає ваше, package-lock якщо це прямо не сумісне з вашим package.json, і в цьому випадку останній буде мати перевагу. (Але я трохи не був у світі JavaScript - мені щось не вистачає?)
Марк

27

Пояснення від розробника NPM :

Ідея, безумовно, полягає в тому, щоб пакет-lock.json був останнім і найбільшим у технології скорочення, а npm-shrinkwrap.json був зарезервований для тих дорогоцінних людей, котрі дуже сильно піклуються про те, щоб їх бібліотеки мали точні node_modules - і для людей, які хочуть, щоб CI використовував npm @> = 2, щоб встановити певне дерево, не збиваючи його npm-версію.

Новий lockfile ("package-lock.json") має в основному весь той самий код, точно той же формат, що і npm-shrinkwrap (ви можете перейменувати їх між собою!). Це також те, що, схоже, розуміє громада: "у неї є файл блокування", схоже, так швидше натискають люди. Нарешті, наявність нового файлу означала, що ми можемо мати відносно низький ризик назад - поступатися зі скороченням без зменшення необхідності робити такі дивні речі, як дозвільна публікація, згадана в батьківському дописі.


18
Мені все одно не зрозуміло в різниці. Якщо npm-shrinkwrapдля точних node_modules .... я припускаю package-lock.json, що блокування менше, ніж точне? І якщо так, то що не замикає, що npm-shrinkwrapблокує?
дман

ви помилилися @dman. package-lock - це нова версія npm-shrinkwrap. Блокування пакета - це відмова (тому вам доведеться видалити функцію, оскільки вона за замовчуванням увімкнена), npm-shrinkwrap - це відключення (тому ви повинні ввімкнути її, оскільки вона не включена до мого замовчування). Причина, чому вони запровадили блокування пакетів, полягає в тому, що 1. користувач тепер має безпечніший спосіб подолання залежностей, оскільки він увімкнено за замовчуванням, і 2. ім'я означає те, що знаходиться в протилежному режимі "скорочення". npm-shrinkwrap мав деякі спеціальні параметри поведінки залежностей, яких зараз немає. npm-shrinkwrap тепер застарілий.
SeriousM

10
це неправильно. Кажучи, що пакет-замок - це нова версія npm-shrinkwrap, ви кажете, що це заміна. npm-shrinkwrap не застаріло і має відмінності з пакетом-lock.json. Крім того, у пакета-lock.json є помилка, тоді як npm-shrinkwrap не робить ... тим самим підкреслюючи більше, тому вони не є тим самим кодом.
дман

Також пакет-lock.json є нав'язливим. Таким чином, це може легко викликати конфлікти scm, якщо ви викликаєте "npm i", тоді як термоусадочна скринька повинна бути явно створена і не спричинити конфлікти на ci-серверах. Так, я можу помилитися тут.
норехов

@dman "package-lock.json має помилку, тоді як npm-shrinkwrap не робить" - ні, ні. Немає вказівки на це у випуску, з яким ви пов’язані; це навіть не згадує npm-shrinkwrap. Як я відзначаю в моїй обороні, перетворення package-lock.jsonв npm-shrinkwrap.jsonбуквально тільки що зробили шляхом перейменування файлу; вони є «той же самий код».
Марк Амері

12

Я думаю, що ідея полягала в тому, щоб - зберегти та зменшити обробку, що відбудеться за замовчуванням, але уникати будь-яких можливих проблем із усадкою, яка виникає там, де цього не хотілося. Отже, вони просто дали йому нове ім’я файлу, щоб уникнути будь-яких конфліктів. Хтось із npm тут пояснив це більш ретельно:

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

Відповідна цитата:

npm публікує більшість файлів у вашому вихідному каталозі за замовчуванням, і люди вже кілька років публікують стислі шрифти. Ми не хотіли порушувати сумісність. За замовчуванням --save та shrinkwrap, існує великий ризик випадкового внесення його та розповсюдження через реєстр, і в основному надає нам можливість оновити deps та dedupe ... null.

Тож ми вибрали нову назву. І ми раптом обрали новий вид імені. Новий lockfile має в основному все той же код, точно той же формат

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.