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

SecretCastle

Ответов: 8

Ответы (8)

Он хранит точное дерево зависимостей с управлением версиями, а не использует управление версиями со звездочкой, как package.json (например, 1.0. *). Это означает, что вы можете гарантировать зависимости для других разработчиков или выпусков продуктов и т. Д. Он также имеет механизм блокировки дерева, но обычно будет регенерироваться, если package.json изменится.

Из документы npm:

package-lock.json автоматически создается для любых операций, когда npm изменяет дерево node_modules или package.json. Он описывает точное дерево, которое было сгенерировано, так что при последующих установках могут генерироваться идентичные деревья, независимо от промежуточных обновлений зависимостей.

Этот файл предназначен для сохранения в исходных репозиториях и служит различным целям:

Опишите единое представление дерева зависимостей, чтобы товарищи по команде, развертывания и непрерывная интеграция гарантированно устанавливали одни и те же зависимости.

Предоставляет пользователям возможность «путешествовать во времени» к предыдущим состояниям node_modules без необходимости фиксировать сам каталог.

Для облегчения большей видимости изменений дерева с помощью читаемых различий в системе управления версиями.

И оптимизируйте процесс установки, разрешив npm пропускать повторяющиеся разрешения метаданных для ранее установленных пакетов. "

Редактировать

Чтобы ответить на вопрос jrahhali ниже об использовании package.json с точными номерами версий. Имейте в виду, что ваш package.json содержит только ваши прямые зависимости, а не зависимости ваших зависимостей (иногда называемые вложенными зависимостями). Это означает, что со стандартным пакетом package.json вы не можете контролировать версии этих вложенных зависимостей, ссылки на них напрямую или одноранговые зависимости не помогут, поскольку вы также не контролируете допуск к версии, который ваш прямой зависимости определяют для этих вложенных зависимостей.

Даже если вы заблокируете версии своих прямых зависимостей, вы не сможете на 100% гарантировать, что ваше полное дерево зависимостей будет каждый раз идентичным. Во-вторых, вы можете разрешить неразрывные изменения (на основе семантического управления версиями) ваших прямых зависимостей, что дает вам еще меньше контроля над вложенными зависимостями, плюс вы снова не можете гарантировать, что ваши прямые зависимости в какой-то момент не нарушат правила семантического управления версиями сами.

Решением всего этого является файл блокировки, который, как описано выше, блокирует версии полного дерева зависимостей. Это позволяет гарантировать ваше дерево зависимостей для других разработчиков или для выпусков, в то же время позволяя тестировать новые версии зависимостей (прямые или косвенные) с использованием вашего стандартного package.json.

Примечание. Предыдущий npm-shrinkwrap.json делал почти то же самое, но файл блокировки переименовал его, чтобы его функция была более понятной. Если в проекте уже есть файл с термоусадочной пленкой, он будет использоваться вместо любого файла блокировки.

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

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

Цель файла package-lock.json - отслеживать точную версию каждого установленного пакета, чтобы продукт был на 100% воспроизводимым таким же образом, даже если пакеты обновляются их сопровождающие.

Это решает очень специфическую проблему, которую package.jsonоставил нерешенной. В package.json вы можете указать, какие версии вы хотите обновить (патч или минор), используя нотацию semver.

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

package-lock.json is written to when a numerical value in a property such as the "version" property, or a dependency property is changed in package.json.

If these numerical values in package.json and package-lock.json match, package-lock.json is read from.

If these numerical values in package.json and package-lock.json do not match, package-lock.json is written to with those new values, and new modifiers such as the caret and tilde if they are present. But it is the numeral that is triggering the change to package-lock.json.

To see what I mean, do the following. Using package.json without package-lock.json, run npm install with:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "7.2.2"
  }
}

package-lock.json will now have:

"sinon": {
  "version": "7.2.2",

Now copy/paste both files to a new directory. Change package.json to (only adding caret):

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.2.2"
  }
}

run npm install. If there were no package-lock.json file, sinon@7.3.0 would be installed. npm install is reading from package-lock.json and installing 7.2.2.

Now change package.json to:

{
  "name": "test",
  "version": "1.0.0",
  ...
  "devDependencies": {
    "sinon": "^7.3.0"
  }
}

run npm install. package-lock.json has been written to, and will now show:

"sinon": {
  "version": "^7.3.0",

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

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

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

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

2022 WebDevInsider