npm package.json OS特定依赖项

时间:2013-03-02 15:23:05

标签: node.js npm node-gyp

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

例如,如果用户运行Linux,我只想安装'dbus'({​​{3}})作为我模块的依赖项。我会对Mac和Windows有不同的依赖。

3 个答案:

答案 0 :(得分:35)

根据您的设置,这可能是一种很好的方法。

npm package.json支持os密钥,

以及optionalDependencies

  • 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构建,每个构建都构建在不同的位置。

     

此模块检查将构建本机插件的所有可能位置,并返回第一个成功加载的位置。