Яка роль пакета-lock.json?


291

npm @ 5 було опубліковано, він має новий функціональний файл package-lock.json (після npm install), який мене бентежить. Я хочу знати, який ефект від цього файлу?

Відповіді:


291

Він зберігає точне дерево з урахуванням залежностей, а не використовує зоряну версію, як, наприклад, сам package.json (наприклад, 1.0. *). Це означає, що ви можете гарантувати залежність для інших розробників або prod версій тощо. Він також має механізм блокування дерева, але, як правило, відновлюватиметься, якщо package.json зміниться.

З документів npm :

package-lock.json автоматично генерується для будь-яких операцій, де npm модифікує або дерево node_modules, або package.json. Він описує точне дерево, яке було сформовано таким чином, що наступні установки можуть генерувати однакові дерева, незалежно від проміжних оновлень залежності.

Цей файл призначений для введення у сховища джерел і виконує різні цілі:

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

Забезпечте можливість для користувачів "подорожувати часом" до попередніх станів node_modules без необхідності вводити сам каталог.

Для полегшення більшої видимості змін дерев через читабельний контроль джерела відрізняється.

І оптимізуйте процес встановлення, дозволяючи npm пропускати повторні розділення метаданих для раніше встановлених пакетів. "

Редагувати

Щоб відповісти на питання jrahhali нижче про просто використання пакета.json з точними номерами версій. Майте на увазі, що ваш package.json містить лише ваші прямі залежності, а не залежності ваших залежностей (іноді їх називають вкладеними залежностями). Це означає, що за допомогою стандартного package.json ви не можете керувати версіями цих вкладених залежностей, посилаючись на них безпосередньо або як однорангові залежності не допоможуть, оскільки ви також не контролюєте допуски до версій, які ваші прямі залежності визначають для цих вкладених залежностей .

Навіть якщо ви заблокуєте версії ваших прямих залежностей, ви не можете на 100% гарантувати, що ваше повне дерево залежності буде кожного разу однаковим. По-друге, ви можете дозволити нерозривні зміни (засновані на семантичній версії) ваших прямих залежностей, що дає вам ще менший контроль за вкладеними залежностями, і ви знову не можете гарантувати, що ваші прямі залежності в якийсь момент не порушать правила семантичного версії. себе.

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

NB. Попереднє скорочення обгортання json зробило майже те саме, але файл блокування перейменовує його, щоб його функції були чіткішими. Якщо в проекті вже є файл зменшення обгортання, він буде використовуватися замість будь-якого файла блокування.


78
Якщо наявність точної версії залежностей так затребувана, чому б не застосувати вказівку точної версії в package.json і не відпустити файл package-lock.json?
jrahhali

15
@jrahhali - внесли зміни до моєї відповіді на основі вашого запитання.
Метт

1
Як отримує це дерево залежності від pacakge.json.lock застосовано до інших розробників? Автоматично?
stevek

40
Зверніть увагу, що ця відповідь більше не є правильною ! package-lock.jsonФайл оновлюється кожного разу , коли ви викликаєте НПМ встановити так НПМ 5.1. (зміна в github.com/npm/npm/isissue/16866 , наприклад в github.com/npm/npm/isissue/17979 ) Тому його більше не можна використовувати для встановлення однакових версій для всіх розробників , якщо не вказати точні версії як 1.2.3замість 1.2.*вашого package.jsonфайлу.
Крістіан

5
Ви повинні додати посилання на те, npm ciяк npm installбуде оновлено package-lock.json, тоді як ci використовує його вміст. Тільки з npm ciотриманням надійних надійних конструкцій.
k0pernikus

34

Це дуже важливе поліпшення для npm: гарантуйте точно таку ж версію кожного пакета .

Як переконатися, що ваш проект побудований з однакових пакетів у різних середовищах за різний час? Скажімо, ви можете використовувати ^1.2.3у своїх package.json, або деякі з ваших залежностей використовуєте саме цей спосіб, але як ви можете переконатись, що кожен раз npm installбуде вибирати однакову версію на вашій розробниковій машині та на сервері збирання? package-lock.json забезпечить це.

npm installбуде знову генерувати файл блокування, коли на сервері збирання чи сервері розгортання, зробіть npm ci(який буде прочитати з файлу блокування та встановити все дерево пакетів)


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

5
Боюся, що Венрікс невірний. npm install це читати package-lock.json. Для відтворення виконайте наступне. за допомогою цього пакета.json, запустіть npm install{... "devDependitions": {"sinon": "7.2.2"}} Тепер скопіюйте / вставте package.jsonі package-lock.jsonв новий каталог. Змінити package.jsonна: "sinon": "^ 7.2.2" run npm install. npm зчитує з пакета-lock.json і встановлює 7.2.2 замість 7.3.0. Без пакета-lock.json було б встановлено 7.3.0.
zumafra

2
І не тільки це, але якщо ви хочете зробити щось на зразок додати карету ^ до package-lock.json, єдиний розумний спосіб зробити це - видалити package-lock.jsonта відновити її за допомогою npm install. (Ви не хочете вручну редагувати package-lock.json). Зміна значення властивості «версія» (близько вгорі) package.jsonзмінить те ж саме в package-lock.jsonна npm install, але з додаванням каретки в залежність не буде робити те ж саме package-lock.json.
zumafra

1
Подумайте package.jsonяк про щось, що ви можете вручну змінити, і package-lock.jsonяк щось, чого ви ніколи не торкаєтесь вручну. Ви завжди керуєте версією BOTH файлів - особливо package-lock.json. Відкрийте обидва файли, вручну відредагуйте назву проекту package.json, запустіть npm installі подивіться, як змінюється назва проекту package-lock.json. licenseздається, не записано в package-lock.json.
zumafra

2
Файл @zumafra package-lock.json буде використовуватися під час роботи npm ci, він npm installбуде просто використовувати package.json, навіть якщо файл блокування надано
Xin

13

package-lock.jsonзаписується, коли числове значення у властивості, такому як "версія", або властивості залежності змінюється на package.json.

Якщо ці числові значення в package.jsonі package-lock.jsonзбігаються, package-lock.jsonзчитується з.

Якщо ці числові значення в package.jsonі package-lock.jsonне збігаються, package-lock.jsonзаписується до цих нових значень та нових модифікаторів, таких як карета і тильда, якщо вони є. Але саме цифра викликає зміни до package-lock.json.

Щоб побачити, що я маю на увазі, виконайте наступне. Використовуючи package.jsonбез package-lock.json, запустіть npm installіз:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json тепер матиме:

"sinon": {
  "version": "7.2.2",

Тепер скопіюйте / вставте обидва файли в новий каталог. Змініть package.jsonна (додаючи лише каре):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

бігати npm install. Якби не було package-lock.jsonфайлу, буде встановлено sinon@7.3.0. npm installце читання з package-lock.json і установкою 7.2.2.

Тепер перейдіть package.jsonдо:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

бігати npm install. package-lock.jsonмає були записані , і тепер буде показувати:

"sinon": {
  "version": "^7.3.0",

7

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


4

package-lock.json автоматично генерується для будь-яких операцій, де npm модифікує або дерево node_modules, або package.json. Він описує точне дерево, яке було сформовано таким чином, що наступні установки можуть генерувати однакові дерева, незалежно від проміжних оновлень залежності.

Він описує єдине представлення дерева залежностей, таким чином, що товаришів по команді, розгортання та безперервної інтеграції гарантовано встановлюють однакові залежності. Він містить такі властивості.

    {
"name": "mobileapp",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@angular-devkit/architect": {
  "version": "0.11.4",
  "resolved": "https://registry.npmjs.org/@angular- devkit/architect/-/architect-0.11.4.tgz",
  "integrity": "sha512-2zi6S9tPlk52vyqNFg==",
  "dev": true,
  "requires": {
    "@angular-devkit/core": "7.1.4",
    "rxjs": "6.3.3"
  }
},

}


2

Цей файл автоматично створюється та використовується npm для відстеження установок вашого пакета та для кращого управління станом та історією залежностей вашого проекту. Ви не повинні змінювати вміст цього файлу.


1
так що станеться, якщо у мене конфлікт із цим файлом?
Олівер Уоткінс,

0

package-lock.json: Він містить точну інформацію про версію, яка зараз встановлена ​​для вашої програми.


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