node.js - 如何使用完全不同的包(不仅仅是不同的包版本号)覆盖嵌套的 npm 子依赖项?

标签 node.js npm

概述
我在解决由 npm audit 识别的 ReDoS 漏洞时遇到问题.我的应用程序有一个嵌套的子依赖项 ansi-html那很容易受到攻击,但不幸的是,似乎maintainers have gone AWOL .正如你在 Github 问题的评论部分看到的,为了解决这个问题,社区已经创建了一个名为 ansi-html-community 的 repo 的分支。位于 here ,解决了这个漏洞。
因此,我想替换 ansi-html 的所有嵌套引用。与 ansi-html-community .
问题
我的正常使用策略 npm-force-resolutions似乎无法完全覆盖具有不同包的嵌套子依赖项,而只能覆盖具有不同版本号的相同包。我已经研究了几个小时,但不幸的是,这是我找到解决此问题的唯一方法 would appear to be with yarn ,我现在正在认真考虑使用它来代替 npm。但是,这并不理想,因为我们的整个 CI/CD 管道都配置为使用 npm。
有没有人知道任何其他方法来完成嵌套的子依赖包替换/解析而不必切换到使用 yarn ?
相关问题
这些是我能够找到的感兴趣的问题,但不幸的是,它们往往只讨论覆盖包版本号的方法,而不是包本身。
讨论如何覆盖版本号:
How do I override nested NPM dependency versions?
有关于npm shrinkwrap的评论讨论(不理想):
npm - how to override a dependent package's dependencies?
相关 StackOverflow 问题的 CSE 索引:
https://cse.google.com/cse?cx=016939242452552083305:j5gjtm1jbtf#gsc.tab=0&gsc.q=How%20to%20override%20nested%20sub%20dependencies%20with%20NPM&gsc.sort=

最佳答案

我想到了。截至 2021 年 10 月,使用 npm-force-resolutions 的解决方案实际上与您使用 yarn 指定它的方式非常相似.您只需要提供一个指向通常会指定覆盖版本号的 tarball 的链接。您的决议部分 package.json应该是这样的:

"resolutions": {
    "ansi-html": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz"
}
要查找 tarball 的链接,请使用以下命令,根据需要修改您的注册表:
npm view ansi-html-community dist.tarball --registry=https://registry.npmjs.org/
另外,请注意对于 npm-force-resolutions运行时工作 npm install ,您将需要一个 preinstall scripts下的条目package.json的部分:
  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  }

关于node.js - 如何使用完全不同的包(不仅仅是不同的包版本号)覆盖嵌套的 npm 子依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69548370/

相关文章:

angularjs - angular ngResource 将附加参数传递给 url

javascript - 使用 grunt 以正确的顺序连接 ember 文件

node.js - 如何正确使用 package.json 中的 "keywords"属性?

node.js - 无法在 expo-react-native 应用程序上运行 'expo start',权限问题

angularjs - 如何创建新的应用程序项目而不需要一次又一次下载和安装 npm 模块?

Javascript es6 - 它是重新分配还是参数?

javascript - 异步 Javascript 有什么大不了的?

node.js - 如何在 express 应用程序中使用 promise ?

node.js - 如何强制 npm 默认安装特定版本的包?

node.js - NPM 配置列表 : environment configs - REGISTRY