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

Jus*_*rty 13 node.js npm

概述

我在解决由 识别的 ReDoS 漏洞时遇到问题npm audit。我的应用程序有一个嵌套的子依赖项ansi-html,很容易受到攻击,但不幸的是,维护者似乎擅离职守了。正如您在 Github 问题的评论部分中看到的,为了解决这个问题,社区对位于ansi-html-community此处的存储库进行了分叉存储库进行了分叉,以解决此漏洞。

因此,我想将所有嵌套引用替换ansi-htmlansi-html-community

问题

我的正常使用策略npm-force-resolutions似乎无法完全覆盖不同包的嵌套子依赖项,而只能覆盖具有不同版本号的相同包。我已经研究了几个小时,但不幸的是,我发现解决这个问题的唯一方法似乎是使用纱线,我现在正在认真考虑使用yarn而不是npm。然而,这并不理想,因为我们的整个 CI/CD 管道都配置为使用 npm。

有谁知道有任何其他方法可以完成嵌套子依赖包替换/解析而不必切换到使用yarn?

相关问题

这些是我能够找到的感兴趣的问题,但不幸的是,他们往往只讨论覆盖包版本号的方法,而不是包本身。

讨论如何覆盖版本号:

如何覆盖嵌套的 NPM 依赖项版本?

有评论讨论npm shrinkwrap(不理想):

npm - 如何覆盖依赖包的依赖项?

Jus*_*rty 22

我想到了。截至 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"
}
Run Code Online (Sandbox Code Playgroud)

要查找 tarball 的链接,请使用以下命令,并根据需要修改注册表:

npm view ansi-html-community dist.tarball --registry=https://registry.npmjs.org/
Run Code Online (Sandbox Code Playgroud)

另请注意,为了npm-force-resolutions在运行时工作npm install,您需要在以下部分preinstall下输入一个条目:scriptspackage.json

npm view ansi-html-community dist.tarball --registry=https://registry.npmjs.org/
Run Code Online (Sandbox Code Playgroud)

  • 作为“预安装”“脚本”运行“npm-force-resolutions”(通过 stackoverflow.com/a/68095189/132735)并没有产生期待的结果(将“tarball”作为“resolved”条目)。手动运行它(“npx npm-force-resolutions”),然后,当然,推送“lockfile”就可以了。或者,人们可以直接转向存在本地选择性分辨率支持的最新纱线。显然 npm 也在烹饪“覆盖”功能 - https://github.com/npm/rfcs/blob/main/accepted/0036-overrides.md :> (3认同)
  • 这并不一定意味着它不起作用。只要您的“ansi-html”最终解析为“ansi-html-community”,您就应该很好。如果您还没有尝试删除 package-lock.json 并重新生成它。然后搜索“ansi-html”的实例并验证其解析结果。 (2认同)