2015-08-26 41 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等...
相關問題