4

我的机器上安装了 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"
    }
  }
}

我希望不要在 package-lock 的版本中添加~tild 或 cap 。^我之前什至没有添加或删除任何包npm installLock文件非常大,因此很难手动维护更改。

问题是什么?我应该如何在不影响旧版本的情况下安装新包?

4

1 回答 1

0

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

文档

package-lock.json描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖项更新如何。

例如,package.json是:

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

在 package-lock 中,有具体版本的链接,例如https://registry.npmjs.org/glamor ///glamor-2.20.40.tgz 的变化只触及了require描述的格式。它是:

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

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

Semver 没有损坏(2.20.40 仍然匹配 ^2.0.0),并且链接保持在原地更新包版本时,仍然会从链接文件中取出包(有一个旧版本的包) 要更新锁定文件中的链接,您必须更改 package.json 或进行 npm 更新。更多参考npm 问题

对此的更多解释:

假设您使用依赖项“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 的结构和记录此子依赖项的方式。

之前,lock 文件会显示它们三个都依赖于 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,因为它们没有更改。

正如我之前在线程中提到的,在这两种情况下您仍然会得到完全相同的 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"
于 2019-05-10T06:21:00.587 回答