npm @ 5 был опубликован, у него есть новый файл package-lock.json (после npm install
), который меня смущает. Я хочу знать, каков эффект этого файла?
npm @ 5 был опубликован, у него есть новый файл package-lock.json (после npm install
), который меня смущает. Я хочу знать, каков эффект этого файла?
Ответы:
Он хранит точное версионное дерево зависимостей, а не использует помеченное версионирование, как сам package.json (например, 1.0. *). Это означает, что вы можете гарантировать зависимости для других разработчиков или выпусков продукта и т. Д. Он также имеет механизм блокировки дерева, но, как правило, восстанавливается при изменении package.json.
Из документов npm :
package-lock.json автоматически генерируется для любых операций, в которых npm изменяет либо дерево node_modules, либо package.json. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.
Этот файл предназначен для фиксации в исходных хранилищах и предназначен для различных целей:
Опишите единственное представление дерева зависимостей, чтобы товарищи по команде, развертывания и непрерывная интеграция гарантированно устанавливали одинаковые зависимости.
Предоставьте пользователям возможность «путешествовать во времени» к предыдущим состояниям node_modules без необходимости фиксации самого каталога.
Для облегчения большей видимости изменений дерева с помощью читаемых исходных кодов контроля.
И оптимизировать процесс установки, позволяя npm пропускать повторные разрешения метаданных для ранее установленных пакетов ».
Чтобы ответить на вопрос Джрахали ниже об использовании package.json с точными номерами версий. Помните, что ваш package.json содержит только ваши прямые зависимости, а не зависимости ваших зависимостей (иногда называемые вложенными зависимостями). Это означает, что со стандартным package.json вы не можете контролировать версии этих вложенных зависимостей, ссылаться на них напрямую или в качестве одноранговых зависимостей не поможет, так как вы также не контролируете допуск на версию, который ваши прямые зависимости определяют для этих вложенных зависимостей. ,
Даже если вы заблокируете версии ваших прямых зависимостей, вы не можете на 100% гарантировать, что ваше полное дерево зависимостей будет всегда идентичным. Во-вторых, вы можете разрешить неразрывные изменения (основанные на семантическом управлении версиями) ваших прямых зависимостей, что дает вам еще меньший контроль над вложенными зависимостями, и опять же вы не можете гарантировать, что ваши прямые зависимости в какой-то момент не нарушат правила семантического управления версиями самих себя.
Решением всего этого является файл блокировки, который, как описано выше, блокирует версии полного дерева зависимостей. Это позволяет вам гарантировать ваше дерево зависимостей для других разработчиков или для выпусков, в то же время позволяя тестировать новые версии зависимостей (прямые или косвенные), используя ваш стандартный package.json.
NB. Предыдущее сжатие json сделало почти то же самое, но файл блокировки переименовал его, чтобы его функция стала понятнее. Если в проекте уже есть файл термоусадочной пленки, он будет использован вместо любого файла блокировки.
package-lock.json
Файл обновляется каждый раз , когда вы вызываете НПМ установить так НПМ 5.1. (изменение в github.com/npm/npm/issues/16866 , пример в github.com/npm/npm/issues/17979 ) Поэтому его больше нельзя использовать для установки одинаковых версий для всех разработчиков , если только вы не указали точные версии. как 1.2.3
вместо 1.2.*
в вашем package.json
файле.
npm ci
as, npm install
чтобы обновить package-lock.json, тогда как ci использует его содержимое. Только при npm ci
этом вы получите повторяющиеся надежные сборки.
Это очень важное улучшение для npm: гарантировать одинаковую версию каждого пакета .
Как убедиться, что ваш проект собран с одинаковыми пакетами в разных средах в разное время? Давайте скажем, вы можете использовать ^1.2.3
в вашем package.json
, или некоторые из ваших зависимостей используют этот способ, но как может у обеспечить каждый раз npm install
подберут ту же версию в вашем Dev машине и на сервере сборки? 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
. Для воспроизведения сделайте следующее. используя этот package.json, запустите npm install
{... "devDependencies": {"sinon": "7.2.2"}} Теперь скопируйте / вставьте package.json
и package-lock.json
в новый каталог. Измените package.json
на: "sinon": "^ 7.2.2" run npm install
. npm читает из package-lock.json и устанавливает 7.2.2 вместо 7.3.0. Без package-lock.json будет установлен 7.3.0.
package-lock.json
, единственный разумный способ сделать это - удалить package-lock.json
и восстановить его, используя npm install
. (Вы не хотите редактировать вручную package-lock.json
). Изменение значения свойства "version" (в верхней части) package.json
изменится на package-lock.json
on npm install
, но добавление каретки к зависимости не приведет к тому же package-lock.json
.
package.json
чем-то, что вы можете изменить вручную, и о package-lock.json
чем-то, чего вы никогда не касаетесь вручную. Вы всегда управляете версиями ОБА файлов - особенно 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: содержит точную информацию о версии, которая в данный момент установлена для вашего приложения.