有没有一种方法可以在npm的package.json文件中指定特定于操作系统的依赖关系?
例如,如果用户正在运行Linux,我只想安装'dbus'(https://npmjs.org/package/dbus)作为我的模块的依赖项。 我将拥有Mac和Windows的不同依赖项。
有没有一种方法可以在npm的package.json文件中指定特定于操作系统的依赖关系?
例如,如果用户正在运行Linux,我只想安装'dbus'(https://npmjs.org/package/dbus)作为我的模块的依赖项。 我将拥有Mac和Windows的不同依赖项。
这个问题有一个可能的好办法,取决于你的设置。
npm package.json 支持一个 os 键,
os
可以用来指定一个模块可以安装在哪个操作系统上。optionalDependencies
是模块的依赖项,如果它们无法安装,npm 将跳过它们并继续安装。通过这种方式,你的模块可以为每个操作系统设置一个可选的依赖项,只有适用的依赖项才会被加载/安装 ^.^
编辑:正如 @Sebastien 在下面提到的,这种方法是危险的。 对于任何给定的操作系统,至少有一个依赖项是“必需的”,其余的是“可选的”。将所有版本的依赖项都设置为可选意味着如果你的安装由于合理的原因失败,它将悄悄地跳过安装,而你将缺少一个你真正需要的依赖项。
fsevents
是可选依赖项,但我并不关心它,因为我的构建脚本在LINUX上运行。 - chen binrequire()
正确的文件。,"scripts": {
"install": "node install_dependencies.js"
}
然后添加一个install_dependencies.js
文件,该文件检查操作系统并运行适当的npm install ...
命令来安装依赖项。
package.json
来管理项目的安装,而且你不需要发布,那么使用 .gyp
并不是解决方案。请参考 TinyTimZamboni 在下面的帖子,它更适合这种情况(https://dev59.com/mGUp5IYBdhLWcg3wmIUt#26069595)。 - MetalskinoptionalDependencies
曾经让我吃过亏。请遵循此答案中的建议。如果可能,请在运行时解决,否则请使用安装脚本。 - gilly3https://www.npmjs.com/package/bindings-shyp
加载本地模块 .node 文件的帮助模块这是针对 Node.js 本地插件模块作者的一个帮助模块,可以理解为 "瑞士军刀",用于 require() 您的本地模块 .node 文件。
在 Node 的本地插件历史中,插件编译到不同的位置,取决于使用的构建工具和 Node 的版本。更糟糕的是,现在 gyp 构建工具可以生成 Release 或 Debug 构建,每个构建都编译到不同的位置。
这个模块检查本地插件可能被编译的所有位置,并返回首次成功加载的位置。
引用 @npm_support:
https://twitter.com/npm_support/status/968195526989512705
如果您想避免与依赖项相关的安装问题,其中一种方法是编写一个需要作为常规依赖项的包装器,并确保它具有optionalDeps
(还要确保包装器验证您拥有完成所需的所有内容)。
dependencies: { "common-stuff": "*" }
overrides: {
"os: { linux: { dependencies: { "+best-linux-module" } } }
}
我认识的一位开发人员建议另一种选择,即引入一个提供关键字,然后几个模块可以提供与解析器相同的语义(类似于Debian),但这会产生类似的开销。
我正在寻找一种通用方法,不仅专注于操作系统支持,还包括其他软件包的变体(例如取决于引擎)。
你是否知道NPM跟踪器中的任何相关问题?如果没有,我考虑提交一个要在以下位置跟踪的错误:
https://github.com/npm/npm/issues?q=dependencies+conditional
欢迎对这个想法提出反馈。
os
字段,但它不能让你基于当前平台交换依赖项 - 它只是声明一个包在哪些平台上是白名单/黑名单。例如,package.json
中的这个属性:"os": ["!win32", "darwin"]
意味着“此包将无法在Windows上运行,但可以在Mac上运行”。不幸的是,这并不能真正实现你所要求的。 - smithclay