Json OS 特定的依赖项

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

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

37642 次浏览

我认为简短的回答是不。不过,我可以想出一些变通方法——最简单的方法是将所有内容添加到 package.json,而不管操作系统是什么,然后在运行时将正确的内容添加到 require()

如果这对您不起作用,那么您可以使用一个安装脚本来获得您想要的结果-https://docs.npmjs.com/misc/scripts

我还没有测试过这个,但我认为它会起作用:

把这样的东西添加到你的程序包中。 json:

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

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

有一个可能的好方法来做到这一点,这取决于您的设置。

Json 支持 奥斯密钥,

还有 可选择的依赖关系

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

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

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

还有 捆绑,灵巧模块:

Https://www.npmjs.com/package/bindings-shyp

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

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

在 Node 的原生插件历史过程中,插件最终被编译到各种不同的地方,这取决于使用的构建工具和节点的版本。更糟糕的是,现在 gip 构建工具可以生成发布或调试构建,每个构建都位于不同的位置。

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

引用@npm _ support:

Https://twitter.com/npm_support/status/968195526989512705

2/2如果你想避免与依赖关系相关的安装问题,一种方法是编写一个作为常规依赖关系所需的包装器,并确保它具有 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

欢迎对这个想法提出反馈意见。