我需要根据 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 进行解析很“有趣”
- 按 Node 版本维护模块 list 很“有趣”
- 以编程方式使用 npm 很“有趣”
对比:
- 维护几个不同的 package.json 版本
- 编写一些“DevOps”脚本来为您处理特定于环境的安装(grunt-node-version?)
- 花更少的时间查看 npm、semver 等的源代码...
关于node.js - 根据引擎使用不同版本的npm依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235414/