Какова роль пакета-lock.json?


291

npm @ 5 был опубликован, у него есть новый файл package-lock.json (после npm install), который меня смущает. Я хочу знать, каков эффект этого файла?

Ответы:


291

Он хранит точное версионное дерево зависимостей, а не использует помеченное версионирование, как сам 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 сделало почти то же самое, но файл блокировки переименовал его, чтобы его функция стала понятнее. Если в проекте уже есть файл термоусадочной пленки, он будет использован вместо любого файла блокировки.


78
Если необходимо получить точную версию зависимостей, почему бы не принудительно указать точную версию в package.json и отказаться от файла package-lock.json?
Джрахали

15
@jrahhali - изменили мой ответ на основании вашего вопроса.
Мэтт

1
Как это дерево зависимостей из pacakge.json.lock применяется для других разработчиков? Автоматически?
Стив К

40
Обратите внимание, что этот ответ больше не является правильным ! package-lock.jsonФайл обновляется каждый раз , когда вы вызываете НПМ установить так НПМ 5.1. (изменение в github.com/npm/npm/issues/16866 , пример в github.com/npm/npm/issues/17979 ) Поэтому его больше нельзя использовать для установки одинаковых версий для всех разработчиков , если только вы не указали точные версии. как 1.2.3вместо 1.2.*в вашем package.jsonфайле.
Кристиан

5
Вы должны добавить ссылку на npm cias, npm installчтобы обновить package-lock.json, тогда как ci использует его содержимое. Только при npm ciэтом вы получите повторяющиеся надежные сборки.
k0pernikus

34

Это очень важное улучшение для npm: гарантировать одинаковую версию каждого пакета .

Как убедиться, что ваш проект собран с одинаковыми пакетами в разных средах в разное время? Давайте скажем, вы можете использовать ^1.2.3в вашем package.json, или некоторые из ваших зависимостей используют этот способ, но как может у обеспечить каждый раз npm installподберут ту же версию в вашем Dev машине и на сервере сборки? package-lock.json обеспечит это.

npm installповторно сгенерирует файл блокировки, когда на сервере сборки или сервере развертывания, выполните npm ciкоманду (которая прочитает файл блокировки и установит все дерево пакетов)


9
Обратите внимание, что это уже устарело. Начиная с версии 5.1.0, «npm install» вообще не читает package-lock.jsonфайл. Он просто устанавливается package.jsonкак раньше. Чтобы использовать package-lock.jsonфайл, вы должны использовать новую команду "npm ci", которая установит точные версии, перечисленные в, package-lock.jsonвместо диапазонов версий, указанных в package.json.
Venryx

5
Боюсь, что Venryx неверен. 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.
Зумафра

2
И не только это, но если вы хотите сделать что-то вроде добавления каретки ^ package-lock.json, единственный разумный способ сделать это - удалить package-lock.jsonи восстановить его, используя npm install. (Вы не хотите редактировать вручную package-lock.json). Изменение значения свойства "version" (в верхней части) package.jsonизменится на package-lock.jsonon npm install, но добавление каретки к зависимости не приведет к тому же package-lock.json.
Зумафра

1
Думайте о package.jsonчем-то, что вы можете изменить вручную, и о package-lock.jsonчем-то, чего вы никогда не касаетесь вручную. Вы всегда управляете версиями ОБА файлов - особенно package-lock.json. Откройте оба файла, вручную отредактируйте имя проекта package.json, запустите npm installи посмотрите, как меняется имя проекта package-lock.json. licenseкажется, не записывается в package-lock.json.
Зумафра

2
@zumafra package-lock.json файл будет использоваться при этом npm ci, npm installпросто будет использовать package.json, даже если файл блокировки предоставлен
Xin

13

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",

7

Также важно упомянуть улучшение безопасности, которое идет с файлом блокировки пакета. Так как он сохраняет все хэши пакетов, если кто-то вмешается в общедоступный реестр npm и изменит исходный код пакета, даже не изменив версию самого пакета, он будет обнаружен файлом блокировки пакетов.


4

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"
  }
},

}


2

Этот файл автоматически создается и используется npm для отслеживания установок вашего пакета и для лучшего управления состоянием и историей зависимостей вашего проекта. Вы не должны изменять содержимое этого файла.


1
так что произойдет, если я получу конфликт с этим файлом?
Оливер Уоткинс

0

package-lock.json: содержит точную информацию о версии, которая в данный момент установлена ​​для вашего приложения.


1
Привет и добро пожаловать. На этот вопрос уже дан ответ. Вы должны проверить, помечен ли вопрос как ответ, чтобы увидеть, есть ли перед каждым из ответов зеленый щелчок.
Нестор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.