2015-08-26 39 views
4

我需要基于节点引擎指定不同版本的依赖关系。事情是这样的:使用基于引擎的不同版本的NPM依赖关系

{ 
    "node": { 
    "0.10.x": { 
     "zombie": "2.5.1" 
    }, 
    "0.12.x": { 
     "zombie": "^3.5.0" 
    } 
    }, 
    "iojs": { 
    "^3.0.0": { 
     "zombie": "^4.0.0" 
    } 
    } 
} 

这是无论是内置还是有使这样的事情一个模块?

+1

根据引擎版本生成package.json的pre和post安装脚本的巧妙组合可能可以实现这一点。 –

+0

这就是我的想法,但想问问有没有人知道它。 –

+0

内置,否,但可能有一个模块。然而,在这里不允许要求第三方工具,所以你不可能收到一个答案。 –

回答

2

“是的,但是......”

没有内置,但有可能。

明智吗? ...

:)

// 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等...
相关问题