我需要根据Node引擎指定不同版本的依赖项.像这样的东西:
{
"node": {
"0.10.x": {
"zombie": "2.5.1"
},
"0.12.x": {
"zombie": "^3.5.0"
}
},
"iojs": {
"^3.0.0": {
"zombie": "^4.0.0"
}
}
}
这是内置的还是有一个模块可以实现这种功能?
最佳答案 “对,但是…”
不是内置的,但可能.
明智的做? …
🙂
// simplifying for the answer, only looking at node versions...
var npm = require("npm");
var semver = require("semver");
if (semver.satisfies(process.version, "0.12.x")){
npm.load(null, function(){
installPkg("chalk", "0.5.1");
})
}
function installPkg(pkg, ver) {
if(require.resolve(pkg)){
throw Error("package already installed");
}
var semverPkg = pkg + "@" + ver;
npm.commands.install([semverPkg], function (err, result) {
if (err) console.log("error loading chalk");
});
}
以编程方式使用NPM有点令人沮丧,因为它没有很好的文档记录.当其他人为你完成所有工作时,Semver非常酷,但建立比较/满足检查是一项繁琐的工作.
另外,这样做,你可能不想每次都尝试安装,所以你现在还必须做一些启动检查,以确保你没有减慢你的应用程序重启时间,因为它重新每次安装每个包..
您可以通过检查模块来解决这个问题.如果您决定继续沿着这条路走下去,有几种方法可以解决这个问题.
首先,您可以以严厉的方式使用require.resolve()
来查看模块是否存在. (这就是上面例子中的内容.)
其次,你也可以使用npm.commands.ls
,看起来有点像这样:
if (semver.satisfies(process.version, "0.12.x")){
npm.load(null, function(){
npm.commands.ls([], function(err, data,lite){
// parse the results from ls here, and install or not, etc...
console.log(lite);
});
})
}
所以是的……从技术上讲,这不是问题的解决方案,因为问题很广泛. (不要钓鱼让你接受,只是解释我感觉到你的痛苦,并且走了类似的道路,这就是为什么我之前详细探讨了semver和npm.)
痛苦的一点:
>使用semver解析是“有趣的”
>按节点版本维护模块清单是“有趣的”
>以编程方式使用npm是“有趣”
VS:
>维护一些不同的package.json版本
>编写一些“DevOps”脚本来为您处理特定于env的安装(grunt-node-version?)
>花更少的时间查看npm,semver等的源代码……