node.js – 根据引擎使用不同版本的NPM依赖项

我需要根据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等的源代码……

点赞