【问题标题】:How to update the dependency of one package which is in package-lock.json如何更新 package-lock.json 中的一个包的依赖关系
【发布时间】:2019-10-02 15:22:19
【问题描述】:

我们想将 lodash 版本更新为 4.17.11,但它是 grunt-angular-translate 的依赖项。 grunt-angular-translate 在 package.json 中。如果我将 grunt-angular-translate 更新为 0.3.0,它不会将 lodash 更新为 4.7.11 版本。我们如何更新 package-lock.json 中的依赖项。

package.json:

"devDependencies": {
    "grunt": "^1.0.3",
    "grunt-angular-translate": "^1.0.0",
    "grunt-bump": "^0.8.0",

package-lock.json:

"grunt-angular-translate": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/grunt-angular-translate/-/grunt-angular-translate-0.3.0.tgz",
      "integrity": "sha1-vQEYr6JNj1cCMf2NUtgp2AjFEbM=",
      "dev": true,
      "requires": {
        "flat": "^1.2.0",
        "json-stable-stringify": "^1.0.0",
        "lodash": "~2.4.1"
      },
      "dependencies": {
        "lodash": {
          "version": "2.4.2",
          "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
          "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
          "dev": true
        }
      }
    },

【问题讨论】:

    标签: npm lodash npm-install


    【解决方案1】:

    根据npm docs

    package-lock.json 会自动为任何操作生成 npm 修改 node_modules 树或 package.json。它 描述了生成的确切树,以便后续 安装能够生成相同的树,无论 中间依赖更新。

    此文件旨在提交到源存储库中,并且 有多种用途:

    描述依赖树的单个表示,使得 保证队友、部署和持续集成 安装完全相同的依赖项。

    为用户提供“时间旅行”到之前状态的便利 node_modules 无需提交目录本身。

    通过可读性提高树变化的可见性 源代码管理差异。

    并通过允许 npm 跳过重复来优化安装过程 以前安装的包的元数据解析。

    package.json 中,您指定您在应用程序中使用的 npm 包。换句话说,你有一个特定的依赖,所以你的包可以运行。

    package-lock.json您的应用使用它们的依赖项的每个包的大“地图”,您无法影响这些包。

    在您的情况下,grunt-angular-translate"lodash": "~2.4.1"它自己的依赖项,您不能更改它,也不应该尝试更改它,因为该软件包应该适用于该版本而不是 2 个版本更高的包,可能会有一堆重大更改。

    您可以将 lodash 的直接依赖项升级到其最新版本,但这不会将 grunt-angular-translate 对 lodash 的依赖项更新到该版本,而且它确实不应该。

    真正应该发生的是在您的 node_modules 文件夹中,您将获得更新的 lodash(您可以通过查看它的 package.json 和里面的版本来检查)。在同一个文件夹中,如果您进入 grunt-angular-translate 文件夹并查看它自己的 node_modules ...它应该有自己的 lodash 文件夹,其中包含 lodash 2.4.1

    【讨论】:

    • 由于这个 package-lock.json 我得到了 lodash:2.4.1 的原型污染漏洞。如果我停止使用npm config set package-lock false 生成 package-lock.json,是否有机会不再遇到此漏洞?谢谢。
    • 如果你一起避免package-lock,你会让自己陷入其他问题。要么放松这种依赖关系,要么在他们的 repo 上打开一个问题,并因为这个漏洞而要求更新它。如果不再支持该存储库,那是另一个将其全部替换的原因。
    • 有没有其他方法可以摆脱这个漏洞?
    • 嗯,这个 PR (github.com/angular-translate/grunt-angular-translate/pull/93/…) 正在做你想做的事,所以你可以在那个 PR 上询问(竖起大拇指等),或者干脆分叉那个 repo 并自己更新这些包。在这一点上,似乎 lib 不再被积极维护,所以你真的没有什么可担心的或错过新的更新:|等
    • 这没有回答问题。假设我在我的项目中使用“3.8.3”的“superagent”,我想将我的包锁更新为“5.1.0”。我是否必须手动调整它,还是 npm 可以处理锁定文件的这种有针对性的更新?
    最近更新 更多