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" runnpm 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
onnpm 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
с:package-lock.json
теперь будет иметь:Теперь скопируйте / вставьте оба файла в новый каталог. Изменить
package.json
на (только добавление каретки):бежать
npm install
. Если бы не былоpackage-lock.json
файла, sinon@7.3.0 будет установлен.npm install
это чтение сpackage-lock.json
и установкой 7.2.2.Теперь измените
package.json
на:бежать
npm install
.package-lock.json
было написано , и теперь покажет:источник
Также важно упомянуть улучшение безопасности, которое идет с файлом блокировки пакета. Так как он сохраняет все хэши пакетов, если кто-то вмешается в общедоступный реестр npm и изменит исходный код пакета, даже не изменив версию самого пакета, он будет обнаружен файлом блокировки пакетов.
источник
package-lock.json автоматически генерируется для любых операций, в которых npm изменяет либо дерево node_modules, либо package.json. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.
Он описывает единственное представление дерева зависимостей, так что товарищи по команде, развертывания и непрерывная интеграция гарантированно устанавливают точно такие же зависимости. Содержит следующие свойства.
}
источник
Этот файл автоматически создается и используется npm для отслеживания установок вашего пакета и для лучшего управления состоянием и историей зависимостей вашего проекта. Вы не должны изменять содержимое этого файла.
источник
package-lock.json: содержит точную информацию о версии, которая в данный момент установлена для вашего приложения.
источник