有没有办法在npm package.json文件中指定特定于操作系统的依赖项?
例如,如果用户运行Linux,我只想安装'dbus'({{3}})作为我模块的依赖项。我会对Mac和Windows有不同的依赖。
答案 0 :(得分:35)
根据您的设置,这可能是一种很好的方法。
npm package.json支持os密钥,
os
可用于指定可以安装模块的操作系统。optionalDependencies
是模块依赖项,如果无法安装,npm会跳过它们并继续安装。通过这种方式,您可以让您的模块具有每个操作系统的可选依赖项,并且只会加载/安装一个可用的模块^。^
编辑:正如@Sebastien在下面提到的那样,这种做法很危险。 对于任何给定的操作系统,至少有一个依赖项是“必需的”,其余的是“可选的”。使所有版本的依赖项可选意味着如果您的安装因合法原因而失败,它将默默地跳过安装,您将缺少您真正需要的依赖项。
答案 1 :(得分:7)
我认为简短的回答是否定的。我可以想到几个解决方法 - 最简单的方法是将所有内容添加到package.json而不管操作系统,然后在运行时require()
添加正确的。
如果这对您不起作用,您可以使用安装脚本来获得您想要的结果 - https://docs.npmjs.com/misc/scripts
我没有对此进行测试,但我认为它会起作用:
将这样的内容添加到package.json:
,"scripts": {
"install": "node install_dependencies.js"
}
然后添加一个install_dependencies.js
文件来检查操作系统并运行相应的npm install ...
命令。
答案 2 :(得分:1)
还有 bindings-shyp 模块:
https://www.npmjs.com/package/bindings-shyp
用于加载本机模块的.node文件的辅助模块
这是Node.js本机插件模块作者的辅助模块。它基本上是require()你的本机模块的.node文件的“瑞士军刀”。
在Node的本机插件历史记录中,插件最终在各种不同的位置进行编译,具体取决于使用的构建工具和节点版本。更糟糕的是,现在gyp构建工具可以生成Release或Debug构建,每个构建都构建在不同的位置。
此模块检查将构建本机插件的所有可能位置,并返回第一个成功加载的位置。