繁体   English   中英

如何使用 npm 更新依赖项的依赖项

[英]How to update dependencies of dependencies using npm

我很想知道我找不到这个简单问题的答案。 我也很想知道npm update不能解决这个问题。

我无法在此处发布完整的依赖关系树,但无论如何让我描述一下我的问题:

minimist 已过时(版本 1.2.0)并且在此版本中存在安全漏洞。 软件包需要 minimist 将依赖项定义为 ^1.2.0 - 因此它与 1.2.2 兼容。

常见的解决方案是将其放入devDependencies中的package.json^1.2.2dependencies项中。 我不想把它放到package.json中。 我觉得npm update也应该更新间接依赖。

我错过了什么吗?

在这里你可以看到我的 package-lock.json: https ://github.com/tflori/riki-community/blob/master/package-lock.json

以及npm ls minimist的输出:

riki-community@ /home/iras/work/projects/riki/community
├─┬ awesome-typescript-loader@5.2.1
│ ├─┬ loader-utils@1.2.3
│ │ └─┬ json5@1.0.1
│ │   └── minimist@1.2.0  deduped
│ └─┬ mkdirp@0.5.1
│   └── minimist@0.0.8 
├─┬ jest@25.1.0
│ └─┬ @jest/core@25.1.0
│   ├─┬ @jest/transform@25.1.0
│   │ └─┬ @babel/core@7.8.7
│   │   └─┬ json5@2.1.2
│   │     └── minimist@1.2.5 
│   └─┬ jest-haste-map@25.1.0
│     └─┬ sane@4.1.0
│       ├─┬ @cnakazawa/watch@1.0.4
│       │ └── minimist@1.2.0  deduped
│       └── minimist@1.2.0  deduped
├─┬ node-sass@4.13.1
│ └─┬ meow@3.7.0
│   └── minimist@1.2.0 
├─┬ ts-jest@25.2.1
│ └─┬ json5@2.1.2
│   └── minimist@1.2.5 
├─┬ tsconfig-paths-webpack-plugin@3.2.0
│ └─┬ tsconfig-paths@3.8.0
│   └── minimist@1.2.0  deduped
└─┬ webpack@4.42.0
  └─┬ watchpack@1.6.0
    └─┬ chokidar@2.1.8
      └─┬ UNMET OPTIONAL DEPENDENCY fsevents@1.2.9
        └─┬ UNMET OPTIONAL DEPENDENCY node-pre-gyp@0.12.0
          ├─┬ UNMET OPTIONAL DEPENDENCY mkdirp@0.5.1
          │ └── UNMET OPTIONAL DEPENDENCY minimist@0.0.8 
          └─┬ UNMET OPTIONAL DEPENDENCY rc@1.2.8
            └── UNMET OPTIONAL DEPENDENCY minimist@1.2.0 

问题在于深度。 从文档中:

从 npm@2.6.1 开始,npm 更新将只检查顶级包。 以前版本的 npm 也会递归地检查所有依赖项。 要获得旧行为,请使用 npm --depth 9999 update。

所以我们必须提供我们想要更新的深度。 在我的情况下,9999 深度花了太长时间,我取消了它。 但是--depth 5就足够了。

npm update --depth 5

如果仍然没有更新依赖项,那么您必须手动更改package-lock.json

打开package-lock.json并找到所有出现的"minimist": {并删除该对象。

例子:

改变这个:

      "dependencies": {
        "minimist": {
          "version": "1.2.0",
          "bundled": true,
          "dev": true,
          "optional": true
        }
      }

对此:

      "dependencies": {
      }

并再次运行npm install

从 npm v7.0.0开始,运行npm update将始终更新所有包,而不仅仅是根package.json文件中指定的包。 NPM 从npm update命令中删除--depth选项并改变了它的行为。

注意:仍然有可能某些底层包将过时的版本指定为依赖项,这将阻止npm update安装最新版本。 除了强制解决更新版本之外,您没有太多选择。

我还需要手动将 minimist 版本从“0.0.8”更改为“^1.2.5”,以获得“mkdirp”的依赖

如果您想递归更新所有依赖项,我相信这是最快、最强大的解决方案:

首先,确保提交任何更改,以防遇到git commit package*.json问题。 其次,根据需要使用npm outdatednpm update xyz更新您的任何直接依赖项

现在,使用 package-lock.json 的干净构建更新所有包版本:

# remove current node_modules/ and package-lock.json
rm -rf package-lock.json node_modules/

# rebuild package-lock.json the the semantically-compatible 
# latest package versions & install node_modules/
npm install

# ensure nothing broke
npm test

如果有问题,回滚:

rm -rf package-lock.json node_modules/
git checkout package*.json
npm install

PS 这种技术对我来说效果很好,但我一直在学习更多关于 NPM 和包锁的知识。 我很想听听其他 NPM 专家对这项技术的看法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM