我们想说我想创建一个跨平台的frobnicator
包。
我很幸运,发现需要一些npm包,但他们都依赖于平台
frobnicator-win
frobnicator-mac
frobnicator-linux
所以我只需要一个跨平台的包装器。代码可能非常简单(假设API一致性):
var frobnicator;
if (process.platform == 'win32') {
frobnicator = require('frobnicator-win')
} else if (process.platform == 'darwin') {
frobnicator = require('frobnicator-mac')
} else { // let's assume this will work
frobnicator = require('frobnicator-linux')
}
// do the thing
问题出现了:每个小模块都是一个好公民,并分别在package.json
的适当条目中声明它们的兼容平台:
"os": ["win32"]
/ "os": ["darwin"]
/ "os": ["linux"]
这里有两个问题:
1)我依赖于平台依赖的模块(我从不需要所有模块,只需要一个),但我必须将它们全部放在我的package.json
中(它不完美,但我们可以忍受那个)
2)实际上,取决于os
与当前操作系统不匹配的模块是不可能的,因为npm install
将失败。
说,我想在Windows上安装mac包:
$ vim package.json
... // added all dependencies
$ npm install
...
npm ERR! notsup Unsupported
npm ERR! notsup Not compatible with your operating system or architecture: frobnicator-mac@1.0.0
npm ERR! notsup Valid OS: darwin
npm ERR! notsup Valid Arch: any
npm ERR! notsup Actual OS: win32
npm ERR! notsup Actual Arch: ia32
除了要求子包装的所有者解除os
要求之外,还有什么方法可以摆脱这种情况吗?
如果不在package.json
中执行此操作,实际检查平台的最佳解决方法是什么?
如果平台不匹配,则在运行时在CLI脚本中立即调用运行时异常/调用错误回调/ process.exit(1)
?
答案 0 :(得分:1)
optionalDependencies
entry是要走的路。
npm
默认会尝试安装可选的依赖项,但是无法安装它(例如由于模块的平台限制,但不仅仅是)不会使整个过程失败