如何编写一个跨平台的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
会尝试默认安装可选依赖项,但是无法安装(例如,由于平台对模块的限制,但不仅仅是),整个过程不会失败