为什么“ npm install”会更改package-lock.json并添加tild或cap?

时间:2019-05-10 04:35:48

标签: npm npm-install package-lock.json

我的机器上安装了npm版本6。我在package-lock.json中具有以下内容:

{
  "name": "Project",
  "version": "0.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "package1": {
      "version": "0.1.2"
    },
    "package2": {
      "version": "0.2.2"
    }
  }
}

每当我运行npm install时,它都会更新package-lock.json,并且新的联系人就像:

{
  "name": "Project",
  "version": "0.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "package1": {
      "version": "^0.1.2"
    },
    "package2": {
      "version": "~0.2.2"
    }
  }
}

我希望不将~ tild或上限^添加到package-lock版本中。我什至没有在npm install之前添加或删除任何软件包。 Lock文件很大,因此很难手动维护更改。

出什么问题了?如何安装新软件包而不影响旧版本?

1 个答案:

答案 0 :(得分:1)

根据我的理解以及所进行的任何搜索,我可以说,此(package-lock.json)行为是重构的,以使依赖项的可追溯性更容易,即使在此期间获得一些较大的锁定文件差异也是如此不理想。 package-lock.json应该是负责使所有内容保持一致的工具和机制,因此对它的信任是不可避免和必要的。

Documentation

package-lock.json描述了生成的确切树,因此无论中间依赖项更新如何,后续安装都可以生成相同的树。

例如,package.json是:

...
  "glamor": "^2.10.00"
...

在包锁中,有指向特定版本的链接,例如https://registry.npmjs.org/glamor /-/glamor-2.20.40.tgz 所做的更改仅涉及需求描述的格式。 是:

"requires": {
  "glamor": "2.20.40"
}
Became:

"requires": {
  "glamor": "^2.0.0"
}

Semver没有中断(2.20.40仍与^ 2.0.0匹配),并且链接仍然存在 软件包版本更新后,该软件包仍将从链接文件中获取(存在旧版本的软件包) 要更新锁定文件中的链接,您必须更改package.json或进行npm更新。有关更多参考,npm issues

对此有更多解释:

比方说,您使用依赖项“ aaa”,“ bbb”和“ ccc”的固定版本。假设他们每个人都像这样依赖'zzz':

aaa取决于zzz@^1.0.0 bbb取决于zzz@^1.1.0 ccc取决于zzz@^1.0.1

即这三个都取决于zzz的范围,而不是确切的版本。

我们假设zzz的最新版本是1.5.0。

在此更改之前和之后,很明显,zzz的解析版本应为1.5.0,因此唯一的区别是package-lock.json的结构和如何记录此子依赖性。

在此之前,锁定文件将显示所有这三个文件都依赖于zzz@1.5.0,并且z的解析版本为1.5.0。

现在,它记录了每个依赖项的实际“原始”依赖项版本(例如^ 1.0.0,^ 1.1.0等),但仍将z的解析版本显示为1.5.0。

然后考虑释放zzz@1.5.1时会发生什么:

之前,锁定文件需要在所有四个位置从z@1.5.0更新到z@1.5.1。

现在,锁定文件仅需要将z的已解析版本更新为1.5.1,而依赖项可以保留^ 1.0.0,^ 1.1.0和^ 1.0.1,因为它们没有更改。< / p>

正如我之前在线程中提到的那样,在两种情况下,您仍然可以获得完全相同的node_modules。新方法的优点是:

您将看到依赖项的实际要求(例如,范围,而不是确切的版本)。以前,您无法确定aaa实际是否确实需要zzz@1.5.0,或者实际上是zzz@^1.0.0。

锁文件中只有四行,而不是四行。流失更少,发生的事情也更清楚。

顺便说一句,yarn使用了与yarn.lock类似的概念。例如这是一个固定@ sindresorhus / is的示例,但它不是从属符号,可观察到的是:

"@sindresorhus/is@0.10.0":
  version "0.10.0"
  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.10.0.tgz#f42dd6a9d12cd79fa6f53b27cf5bea3a30d2cafa"
  dependencies:
    symbol-observable "^1.2.0"