npm-package-locks An explanation of npm lockfiles

DESCRIPTION

从概念上讲, npm-install的"输入"是package.json ,而其"输出"是一个完整的node_modules树:表示您声明的依赖项. 在理想的世界中,npm就像一个纯函数一样工作:相同的package.json可以随时产生完全相同的node_modules树. 在某些情况下,这确实是正确的. 但是在许多其他情况下,npm无法做到这一点. 原因有很多:

例如,考虑包装A:

{
  "name": "A",
  "version": "0.1.0",
  "dependencies": {
    "B": "<0.1.0"
  }
}

套餐B:

{
  "name": "B",
  "version": "0.0.1",
  "dependencies": {
    "C": "<0.1.0"
  }
}

和包C:

{
  "name": "C",
  "version": "0.0.1"
}

如果这些是注册表中可用的A,B和C的唯一版本,则将安装普通的npm install A

但是,如果发布了[受电子邮件保护] ,则将npm install A新的npm install A

假设新版本没有修改B的依赖关系. 当然,新版本的B可以包括新版本的C和任何数量的新依赖项. 如果不希望发生此类更改,则A的作者可以指定对[电子邮件保护]的依赖关系.但是,如果A的作者和B的作者不是同一个人,则A的作者无法说他或她不想拉在C的最新发布版本中,B完全没有变化.

为了防止这种潜在的问题,NPM用途包lock.json或者,如果存在的话, NPM-shrinkwrap.json . 这些文件称为程序包锁或锁文件.

每当您运行npm install ,npm都会生成或更新您的程序包锁定,如下所示:

{
  "name": "A",
  "version": "0.1.0",
  ...metadata fields...
  "dependencies": {
    "B": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/B/-/B-0.0.1.tgz",
      "integrity": "sha512-DeAdb33F+"
      "dependencies": {
        "C": {
          "version": "git://github.com/org/C.git#5c380ae319fc4efe9e7f2d9c78b0faa588fd99b4"
        }
      }
    }
  }
}

该文件描述了一个精确的 ,更重要的是可复制的 node_modules树. 一旦存在,任何以后的安装都将基于此文件进行工作,而不是根据package.json重新计算依赖项版本.

软件包锁的存在会更改安装行为,从而:

  1. 复制由包锁描述的模块树. 这意味着使用"已解决"中引用的特定文件(如果有)来重现文件中描述的结构,如果没有,则使用"版本"降至正常的包解析度.

  2. 遍历树,以常规方式安装所有丢失的依赖项.

如果preshrinkwrapshrinkwrappostshrinkwrap是在scripts中的财产package.json ,他们将按顺序执行. preshrinkwrapshrinkwrap在收缩包装之前执行, postshrinkwrap之后执行. 这些脚本针对package-lock.jsonnpm-shrinkwrap.json package-lock.json npm-shrinkwrap.json . 例如,对生成的文件运行一些后处理:

"scripts": {
  "postshrinkwrap": "json -I -e \"this.myMetadata = $MY_APP_METADATA\""
}

Using locked packages

使用锁定的软件包与使用没有软件包锁的任何软件包没有什么不同:任何更新node_modules和/或package.json依赖项的命令都将自动同步现有的锁文件. 这包括npm installnpm rmnpm update等.为防止发生此更新,您可以使用--no-save选项完全禁止保存,或使用--no-shrinkwrap允许package.json在更新时保持package-lock.jsonnpm-shrinkwrap.json package-lock.json不变.

强烈建议您将生成的程序包锁定提交给源代码控制:这将允许您团队中的其他任何人,您的部署,您的CI /持续集成以及在包源中运行npm install其他任何人都可以在程序包源中npm install完全相同的依赖树你在继续发展. 此外,这些更改的差异是人类可读的,并且会通知您npm对node_modules所做的任何更改,因此您可以注意到是否有任何传递性依赖项被更新,提升等.

Resolving lockfile conflicts

有时,两个单独的npm安装会创建软件包锁,这些软件包锁会导致源控制系统中的合并冲突. 从[email protected] ,可以通过手动解决任何package.json冲突,然后再次运行npm install [--package-lock-only]来解决这些冲突. npm将自动为您解决任何冲突,并在合理的树中编写合并的软件包锁,其中包括来自两个分支的所有依赖项. 如果提供了--package-lock-only ,它将在不修改本地node_modules/情况下执行此node_modules/ .

To make this process seamless on git, consider installing npm-merge-driver, which will teach git how to do this itself without any user interaction. In short: $ npx npm-merge-driver install -g will let you do this, and even works with pre-[email protected] versions of npm 5, albeit a bit more noisily. Note that if package.json itself conflicts, you will have to resolve that by hand and run npm install manually, even with the merge driver.

SEE ALSO


by  ICOPY.SITE