使用基于引擎的不同版本的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是超级酷的,但是build立比较/满足检查是一件很乏味的工作。

此外,这样做,你可能不想每次都尝试安装,所以你现在也必须做一些启动检查,以确保你不会放慢你的应用程序重新启动时间,每次安装每个包

你可以通过检查模块来解决这个问题。 如果你决定继续下去,有几种方法可以处理这个问题。

首先,你可以使用require.resolve()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); }); }) } 

所以是的,这在技术上不是问题的解决scheme,因为问题是广泛的。 (不是捕鱼让你接受,只是解释我感觉到你的痛苦,并走上了一条类似的道路,这就是为什么我以前详细探讨过semver和npm的原因。)

痛苦的一点:

  • 用semverparsing是“有趣”
  • 通过节点版本维护模块清单是“有趣的”
  • 编程使用npm是“有趣”

VS:

  • 保持一些不同的package.json版本
  • 编写一些“DevOps”脚本来处理你的环境特定的安装( grunt-node-version ?)
  • 花更less的时间在npm,semver等源代码看…