npm @ 5 було опубліковано, він має новий функціональний файл package-lock.json (після npm install
), який мене бентежить. Я хочу знати, який ефект від цього файлу?
npm @ 5 було опубліковано, він має новий функціональний файл package-lock.json (після npm install
), який мене бентежить. Я хочу знати, який ефект від цього файлу?
Відповіді:
Він зберігає точне дерево з урахуванням залежностей, а не використовує зоряну версію, як, наприклад, сам 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 зробило майже те саме, але файл блокування перейменовує його, щоб його функції були чіткішими. Якщо в проекті вже є файл зменшення обгортання, він буде використовуватися замість будь-якого файла блокування.
package-lock.json
Файл оновлюється кожного разу , коли ви викликаєте НПМ встановити так НПМ 5.1. (зміна в github.com/npm/npm/isissue/16866 , наприклад в github.com/npm/npm/isissue/17979 ) Тому його більше не можна використовувати для встановлення однакових версій для всіх розробників , якщо не вказати точні версії як 1.2.3
замість 1.2.*
вашого package.json
файлу.
npm ci
як npm install
буде оновлено package-lock.json, тоді як ci використовує його вміст. Тільки з npm ci
отриманням надійних надійних конструкцій.
Це дуже важливе поліпшення для npm: гарантуйте точно таку ж версію кожного пакета .
Як переконатися, що ваш проект побудований з однакових пакетів у різних середовищах за різний час? Скажімо, ви можете використовувати ^1.2.3
у своїх package.json
, або деякі з ваших залежностей використовуєте саме цей спосіб, але як ви можете переконатись, що кожен раз npm install
буде вибирати однакову версію на вашій розробниковій машині та на сервері збирання? package-lock.json забезпечить це.
npm install
буде знову генерувати файл блокування, коли на сервері збирання чи сервері розгортання, зробіть npm ci
(який буде прочитати з файлу блокування та встановити все дерево пакетів)
package-lock.json
файлу. Він просто встановлюється package.json
як раніше. Щоб скористатися package-lock.json
файлом, ви повинні використовувати нову команду "npm ci", яка встановить точні версії, перелічені в package-lock.json
замість діапазонів версій, наведених у package.json
.
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.
package-lock.json
, єдиний розумний спосіб зробити це - видалити package-lock.json
та відновити її за допомогою npm install
. (Ви не хочете вручну редагувати package-lock.json
). Зміна значення властивості «версія» (близько вгорі) package.json
змінить те ж саме в package-lock.json
на npm install
, але з додаванням каретки в залежність не буде робити те ж саме package-lock.json
.
package.json
як про щось, що ви можете вручну змінити, і package-lock.json
як щось, чого ви ніколи не торкаєтесь вручну. Ви завжди керуєте версією BOTH файлів - особливо package-lock.json
. Відкрийте обидва файли, вручну відредагуйте назву проекту package.json
, запустіть npm install
і подивіться, як змінюється назва проекту package-lock.json
. license
здається, не записано в package-lock.json
.
npm ci
, він npm install
буде просто використовувати package.json, навіть якщо файл блокування надано
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",
Одне важливе, що слід також зазначити, - це поліпшення безпеки, яке постачається з файлом блокування пакета. Оскільки він зберігає всі хеші пакетів, якщо хтось підробляє публічний реєстр npm та змінює вихідний код пакету, навіть не змінюючи версію самого пакета, він буде виявлений файлом блокування пакету.
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"
}
},
}
Цей файл автоматично створюється та використовується npm для відстеження установок вашого пакета та для кращого управління станом та історією залежностей вашого проекту. Ви не повинні змінювати вміст цього файлу.
package-lock.json: Він містить точну інформацію про версію, яка зараз встановлена для вашої програми.