npm package.json操作系统特定的依赖关系

有没有办法在npm package.json文件中指定操作系统特定的依赖关系?

例如,如果用户正在运行Linux,我只想安装'dbus'( https://npmjs.org/package/dbus )作为模块的依赖项。 我将有不同的Mac和Windows的依赖。

有一个可能的好方法,这取决于你的设置。

npm package.json支持一个操作系统密钥,也可选的依赖关系

os可以用来指定一个模块可以安装在哪个操作系统上。 optionalDependencies是模块的依赖关系,如果不能安装,npm会跳过它们并继续安装。

通过这种方式,你可以让你的模块对每个操作系统都有一个可选的依赖项,只有工作的依赖项才会被加载/安装^。^

编辑:正如@Sebastien下面提到的, 这种方法是危险的 。 对于任何给定的操作系统,至less有一个依赖关系是“必需的”,其余的是“可选的”。 使所有版本的依赖项可选意味着,如果您的安装由于合法的原因而失败,它将默默地跳过安装,您将错过您真正需要的依赖项。

我认为简短的答案是否定的。 我可以想到几个解决方法 – 最简单的方法是将所有内容添加到package.json中,而不pipe操作系统是什么,然后在运行时require()正确的。

如果这不适合你,你可以使用安装脚本来得到你要的结果 – https://docs.npmjs.com/misc/scripts

我还没有testing过,但我认为它会工作:

把这样的东西添加到你的package.json中:

 ,"scripts": { "install": "node install_dependencies.js" } 

然后添加一个install_dependencies.js文件来检查操作系统并运行相应的npm install ...命令。

还有bindings-shyp模块: https : //www.npmjs.org/package/bindings-shyp

Helper模块用于加载你的本地模块的.node文件

这是Node.js原生插件模块的作者的帮助模块。 它基本上是要求()你的本地模块的.node文件的“瑞士军刀”。

在Node本地插件历史的整个过程中,插件最终都被编译到各种不同的地方,具体取决于哪个构build工具和哪个版本的节点被使用。 更糟糕的是,现在gyp构build工具可以生成Release或Debug构build,每个构build到不同的位置。

这个模块检查一个本地插件将被构build的所有可能的位置,并且返回成功载入的第一个插件。