如何编写跨平台的npm包装器包,并在不需要的条件依赖"时避免EBADPLATFORM错误。安装?

时间:2014-12-07 13:16:49

标签: node.js npm cross-platform

我们想说我想创建一个跨平台的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)

1 个答案:

答案 0 :(得分:1)

optionalDependencies entry是要走的路。

npm默认会尝试安装可选的依赖项,但是无法安装它(例如由于模块的平台限制,但不仅仅是)不会使整个过程失败