有没有办法在npm package.json文件中指定操作系统特定的依赖项?
例如,如果用户运行的是Linux,我只想安装“dbus”(https://npmjs.org/package/dbus)作为模块的依赖项。对于Mac和Windows,我会有不同的依赖项。
有没有办法在npm package.json文件中指定操作系统特定的依赖项?
例如,如果用户运行的是Linux,我只想安装“dbus”(https://npmjs.org/package/dbus)作为模块的依赖项。对于Mac和Windows,我会有不同的依赖项。
4条答案
按热度按时间34gzjxbg1#
有一个可能的好方法来做到这一点,这取决于你的设置。
npm package.json支持OS密钥,
and also也optionaloptimaladministrations可选
os
可用于指定模块可以安装在哪个操作系统上。optionalDependencies
是模块依赖项,如果无法安装,npm会跳过它们并继续安装。通过这种方式,你可以让你的模块对每个操作系统都有一个可选的依赖项,只有工作的那个才会被加载/安装^。
**编辑:**如@
nxagd54h2#
我可以想到几个变通方法-最简单的是将所有内容添加到package.json中,而不管操作系统如何,然后在运行时将
require()
添加到正确的包中。如果这对你不起作用,你可以使用一个安装脚本来得到你想要的结果-https://docs.npmjs.com/misc/scripts
我还没有测试过这个,但我认为它会工作:
在你的包中添加类似这样的东西.json:
字符串
然后添加一个
install_dependencies.js
文件,用于检查操作系统并运行相应的npm install ...
命令。u3r8eeie3#
还有bindings-shyp模块:
https://www.npmjs.com/package/bindings-shyp
用于加载本机模块的.node文件的Helper模块
这是Node.js原生插件模块作者的帮助模块。它基本上是require()原生模块的.node文件的“瑞士军刀”。
在Node的原生插件历史中,插件最终会在各种不同的地方编译,这取决于使用的构建工具和node的版本。更糟糕的是,现在gyp构建工具可以生成Release或Rendezvous构建,每个构建都构建在不同的位置。
这个模块检查所有可能的本地插件构建的位置,并返回第一个成功加载的位置。
vjhs03f74#
引用@npm_support:
https://twitter.com/npm_support/status/968195526989512705
2/2如果你想避免与依赖项相关的安装问题,一种方法是编写一个作为常规依赖项所需的 Package 器,并确保它具有
optionalDeps
(并确保 Package 器验证你拥有工作所需的一切)。但恕我直言,它看起来更像是一种变通方法,而不是真实的解决问题。
我可以理解npm希望保持可移植性并避免处理平台细节,但无论如何都必须这样做,并且IMHO在运行时这样做并不是最佳的(如果想要优化代码大小,则需要专业)。
因此,今天我没有最佳的解决方案分享,但公开讨论的建议。
npm不能支持“条件依赖”吗?
我想到的第一件事是添加一个“override”部分,它将更改(+add,-remove,=replace)当前解析的部分。
举例来说:
dependencies: { "common-stuff": "*" } overrides: { "os: { linux: { dependencies: { "+best-linux-module" } } } }
个我认识的一个开发人员建议的另一个选择是引入一个provides关键字,然后几个模块可以提供与resolver(一个debian)相同的语义,但它会产生类似的开销。
我正在寻找一个通用的方法,不仅专注于操作系统的支持,但也对其他口味的包(例如,取决于引擎)。
你知道NPM跟踪器中的任何相关问题吗?如果没有,我正在考虑提交一个bug来跟踪:
https://github.com/npm/npm/issues?q=dependencies+conditional的
欢迎反馈这个想法。