【问题标题】:Why does “npm install” changes package-lock.json and adds tild or cap?为什么“npm install”会更改 package-lock.json 并添加 tild 或 cap?
【发布时间】:2019-09-27 23:00:43
【问题描述】:

我的机器上安装了 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 install 之前添加或删除任何包。 Lock 文件非常大,因此很难手动维护更改。

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

【问题讨论】:

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


    【解决方案1】:

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

    Documentation

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

    例如,package.json 是:

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

    在package-lock中,有具体版本的链接,例如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,因为它们没有改变。

    正如我之前在线程中提到的,在这两种情况下您仍然会得到完全相同的 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"
    

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 2020-07-16
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2020-03-05
      • 2018-11-20
      • 2022-01-02
      相关资源
      最近更新 更多