如何编写一个跨平台的npm包装程序包,并避免不必要的“条件依赖性”安装时的EBADPLATFORM错误?

假设我想创build一个跨平台的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要求以外,还有什么办法可以解决吗?

什么可能是最好的解决scheme来实际检查平台,而不是在package.json ? 如果平台不匹配,则立即在CLI脚本中抛出运行时exception/调用错误callback/ process.exit(1)

optionalDependencies依赖项入口是要走的路。

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