Напевно у вас є щось на кшталт:
"typescript":"~2.1.6"
у вашому, package.json
який npm оновлює останню незначну версію, у вашому випадку2.4.1
Редагувати: Запитання від ОП
Але це не пояснює, чому "npm install" змінив би файл блокування. Чи не зафіксований файл блокування для створення відтворюваної збірки? Якщо так, незалежно від значення semver, він все одно повинен використовувати ту саму версію 2.1.6.
Відповідь:
Це призначено для блокування вашого дерева повних залежностей. Скажімо, typescript v2.4.1
вимагає widget ~v1.0.0
. Коли ви npm встановлюєте, це хапає widget v1.0.0
. Пізніше ваш інший розробник (або CI build) встановлює npm і отримує, typescript v2.4.1
але widget
був оновлений до widget v1.0.1
. Тепер ваш модуль вузла не синхронізований. Саме це package-lock.json
заважає.
Або загалом:
Як приклад, розглянемо
пакет A:
{"name": "A", "version": "0.1.0", "залежності": {"B": "<0.1.0"}}
пакет B:
{"name": "B", "version": "0.0.1", "залежності": {"C": "<0.1.0"}}
і пакет C:
{"name": "C", "version": "0.0.1"}
Якщо це єдині версії A, B і C, доступні в реєстрі, тоді встановиться звичайний npm для установки A:
A@0.1.0 - B@0.0.1 - C@0.0.1
Однак якщо B@0.0.2 опубліковано, то свіжа npm install A встановить:
A@0.1.0 - B@0.0.2 - C@0.0.1, якщо нова версія не змінила залежності B. Звичайно, нова версія B може включати нову версію C та будь-яку кількість нових залежностей. Якщо такі зміни є небажаними, автор A може вказати залежність від B@0.0.1. Однак якщо автор A і автор B не є однією і тією ж людиною, немає ніякого способу для автора A сказати, що він або вона не хоче втягувати в опубліковані версії C, коли B зовсім не змінився.
Питання 2 ОП: Тож дозвольте мені зрозуміти, чи правильно я розумію. Що ви говорите, це те, що файл блокування визначає версії вторинних залежностей, але все-таки покладається на нечітке відповідність пакета.json для визначення залежностей верхнього рівня. Це точно?
Відповідь: Ні. Пакет-блокування блокує все дерево пакетів, включаючи кореневі пакети, описані в package.json
. Якщо ви typescript
заблоковані 2.4.1
у вашому package-lock.json
, він повинен залишатися таким, доки він не зміниться. І скажемо, завтра typescript
випускає версію 2.4.2
. Якщо я перевіряю вашу філію та запускаю npm install
, npm буде дотримуватися файлу блокування та встановити 2.4.1
.
Більше на тему package-lock.json
:
package-lock.json автоматично генерується для будь-яких операцій, де npm модифікує або дерево node_modules, або package.json. Він описує точне дерево, яке було сформовано таким чином, що наступні установки можуть генерувати однакові дерева, незалежно від проміжних оновлень залежності.
Цей файл призначений для введення в сховища джерел і служить різним цілям:
Опишіть одне представлення дерева залежностей таким чином, що колеги, розгортання та безперервна інтеграція гарантовано встановлюють однакові залежності.
Забезпечте можливість для користувачів "подорожувати в часі" до попередніх станів node_modules без необхідності виконувати сам каталог.
Для полегшення більшої видимості змін дерев через читабельний контроль джерела відрізняється.
І оптимізуйте процес встановлення, дозволяючи npm пропускати повторні розділення метаданих попередньо встановлених пакетів.
https://docs.npmjs.com/files/package-lock.json