使用基于引擎的不同版本的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等源代码看…