Какова роль пакета-lock.json?
npm @5 опубликован, у него есть новая функция package-lock.json (после npm install
), которая меня смущает. Я хочу знать, каков эффект этого файла?
Ответы
Ответ 1
Он хранит точное версионное дерево зависимостей, а не использует помеченное версионирование, как сам 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 сделало почти то же самое, но файл блокировки переименовал его, чтобы сделать его более понятным. Если в проекте уже есть сжатый файл переноса, он будет использоваться вместо любого файла блокировки.
Ответ 2
Это очень важное улучшение для npm: гарантировать одинаковую версию каждого пакета.
Как убедиться, что ваш проект собран с одинаковыми пакетами в разных средах в разное время? Допустим, вы можете использовать ^1.2.3
в вашем package.json
, или некоторые ваши зависимости используют этот способ, но как вы можете быть уверены, что каждый раз, когда npm install
будет подбирать одну и ту же версию на вашем компьютере разработчика и на сервере сборки? package-lock.json обеспечит это.
npm install
сгенерирует файл блокировки, когда на сервере сборки или сервере развертывания выполните npm ci
(который будет считывать файл блокировки и устанавливать все дерево пакетов)
Ответ 3
package-lock.json
записывается, когда числовое значение в свойстве, таком как свойство "version", или свойство зависимостей изменяется в package.json
.
Если эти числовые значения в package.json
и package-lock.json
совпадают, из package-lock.json
читается.
Если эти числовые значения в package.json
и package-lock.json
не совпадают, в package-lock.json
записываются эти новые значения, а также новые модификаторы, такие как caret и tilde, если они присутствуют. Но именно цифра вызывает изменение в 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
, был бы установлен [email protected] 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",
Ответ 4
Также важно упомянуть улучшение безопасности, которое идет с файлом блокировки пакета. Так как он сохраняет все хэши пакетов, если кто-то вмешается в общедоступный реестр npm и изменит исходный код пакета, даже не изменив версию самого пакета, он будет обнаружен файлом блокировки пакетов.
Ответ 5
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"
}
},
}
Ответ 6
Этот файл автоматически создается и используется npm для отслеживания установок вашего пакета.
и лучше управлять состоянием и историей зависимостей ваших проектов. Вы
не должен изменять содержимое этого файла.