TL;DR: 如何将我的包的依赖项之一更改为不同的包?例如,我想将包 A 的依赖包 B 更改为包 C,但仅适用于包 A(即我不想更改包 A 的上游依赖项)。

我正在为 Leaflet 编写一个插件。 Leaflet 可作为 NPM 包使用(我的插件也将在我完成后提供)。我的插件还扩展了另一个插件 Esri-Leaflet ,它具有 Leaflet 作为依赖项。

我的插件使用 Mocha/Chai/Sinon 作为我代码的测试框架。我在开发期间和作为 CI 的一部分都使用 NPM 脚本运行这些测试。

当我运行依赖于 Leaflet 的测试时,我有很多错误,因为 Leaflet 不幸地依赖于许多在 headless Node 环境中不可用的全局变量(例如 window )。幸运的是,有一个替代包 that was suggested 对我来说叫做 leaflet-headless 可以解决这些问题(如果你很好奇,它实际上是 pretty interesting to see)。

在解决 Esri-Leaflet 的依赖项时,有没有办法只针对我的包告诉 NPM 使用 Leaflet-headless 而不是 Leaflet?也就是说,我要么想要删除下游的 Leaflet 依赖项(因为我的项目已经依赖于 Leaflet-headless)或者将其更改为 Leaflet-headless。

我看过 npm shrinkwrap ,但它似乎只能指定版本号,而不能更改实际的包依赖项。

如果 NPM 没有功能来执行我的要求,您能推荐一个替代解决方案吗?我已经在探索修复对 Leaflet 上游全局变量的依赖,以消除对 Leaflet-headless 的需求。

最佳答案

这可能会或可能不会起作用,具体取决于您的 Node 版本,但我能够使用同名包在 Node 8 上完成类似的操作。

如果您需要使包同名,您可以 fork 项目,并将 fork 重命名为相同(在本例中为 leaflet-headless -> Leaflet )。

有了 fork 后,在 package.json 中写入以下内容

dependencies: {
    "Leaflet": "username/Leaflet"
}

如果您有 package-lock.json,您应该看到 Esri-Leaflet 指向您的 github,而不是原始 Leaflet 项目作为依赖项。

关于node.js - 如何强制 npm 将依赖项的依赖项解析为不同的包?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45064795/

10-13 00:13