有没有办法在 npm package.json 文件中指定特定于 OS 的依赖项?
例如,如果用户正在运行 Linux,我只想安装‘ dbus’(https://npmjs.org/package/dbus)作为模块的依赖项。我会对 Mac 和 Windows 有不同的依赖。
我认为简短的回答是不。不过,我可以想出一些变通方法——最简单的方法是将所有内容添加到 package.json,而不管操作系统是什么,然后在运行时将正确的内容添加到 require()。
require()
如果这对您不起作用,那么您可以使用一个安装脚本来获得您想要的结果-https://docs.npmjs.com/misc/scripts
我还没有测试过这个,但我认为它会起作用:
把这样的东西添加到你的程序包中。 json:
,"scripts": { "install": "node install_dependencies.js" }
然后添加一个 install_dependencies.js文件,该文件检查操作系统并运行相应的 npm install ...命令。
install_dependencies.js
npm install ...
有一个可能的好方法来做到这一点,这取决于您的设置。
Json 支持 奥斯密钥,
还有 可选择的依赖关系
os
optionalDependencies
通过这种方式,您可以让您的模块对每个操作系统有一个可选的依赖项,并且只加载/安装一个可以工作的操作系统。^
编辑: 正如@Sebastien 在下面提到的,这种方法很危险。 对于任何给定的操作系统,至少有一个依赖项是“必需的”,其余的是“可选的”。使依赖项的所有版本成为可选的意味着,如果您的安装由于合理的原因而失败,它将悄悄地跳过安装,并且您将错过您真正需要的依赖项。
还有 捆绑,灵巧模块:
Https://www.npmjs.com/package/bindings-shyp
用于加载本机模块的. node 文件的 Helper 模块 这是 Node.js 原生插件模块作者的一个 helper 模块。它基本上是“瑞士军刀”的要求()你的本地模块的。节点文件。 在 Node 的原生插件历史过程中,插件最终被编译到各种不同的地方,这取决于使用的构建工具和节点的版本。更糟糕的是,现在 gip 构建工具可以生成发布或调试构建,每个构建都位于不同的位置。 该模块检查所有可能构建本机插件的位置,并返回第一个成功加载的位置。
用于加载本机模块的. node 文件的 Helper 模块
这是 Node.js 原生插件模块作者的一个 helper 模块。它基本上是“瑞士军刀”的要求()你的本地模块的。节点文件。
在 Node 的原生插件历史过程中,插件最终被编译到各种不同的地方,这取决于使用的构建工具和节点的版本。更糟糕的是,现在 gip 构建工具可以生成发布或调试构建,每个构建都位于不同的位置。
该模块检查所有可能构建本机插件的位置,并返回第一个成功加载的位置。
引用@npm _ support:
Https://twitter.com/npm_support/status/968195526989512705
2/2如果你想避免与依赖关系相关的安装问题,一种方法是编写一个作为常规依赖关系所需的包装器,并确保它具有 optionalDeps(还要确保包装器验证你具有工作所需的一切)。
optionalDeps
但恕我直言,这看起来更像是一种解决办法,而不是真正解决问题。
我可以理解 npm 想要保持可移植性并避免处理平台细节,但是无论如何都必须这样做,而且在运行时这样做并不是最佳选择(如果想要优化代码大小的话,特别需要这样做)。
因此,今天我没有最佳的解决方案可以分享,只能公开讨论提案。
在 npm 中不能支持“条件依赖”吗?
我想到的第一件事是添加一个“覆盖”部分,该部分将更改(+ add,-remove,= place)当前解析的部分。
例如:
依赖项: {“ common-stuff”: “ *”} 覆盖: { “ os: { linux: { 附件: {“ + best-linux-module”}} }
我认识的一个开发人员建议的其他选择是引入一个 提供关键字,然后几个模块可以提供与解析器(la debian)相同的语义,但是它产生了类似的开销。
我正在寻找一个通用的方法,不仅集中在操作系统的支持,而且在其他风格的包(例如,取决于引擎)。
你知道 NPM 跟踪器有什么相关的问题吗?如果没有,我正在考虑提交一个错误,以跟踪在:
Https://github.com/npm/npm/issues?q=dependencies+conditional
欢迎对这个想法提出反馈意见。