2012-06-27 26 views
4

我有一個已部署的Node.js版本0.6,併爲各種項目安裝了大量的軟件包。如何檢查npm包是否支持Node.js v0.8.x?

是否有直接的方法來檢查所有使用NPM安裝的軟件包以查看它們是否支持Node.js v 0.8.x?

我可以看到package.json文件應該說說明它們的版本是什麼,儘管我猜測很多不會包含這個 - 所以我真的只對那些聲明它們的軟件包感興趣不是兼容節點v 0.8.x

例如他們在的package.json是這樣的:

"engines": { 
    "node": "<0.8.0" 
}, 

"engines": { 
    "node": "=0.6.*" 
}, 

我只是想不兼容包的簡單列表。

回答

4

試試這個在您的應用程序的基本目錄:

find . -name package.json -exec node -e 'var e = JSON.parse(require("fs").readFileSync(process.argv[1]))["engines"]; if (e && e.node) { var bad = false; if (e.node.match(/<\s*0\.[0-8]([^.]|\.0)/)) bad = true; if (e.node.match(/(^|[^>])=\s*0\.[^8]/)) bad = true; if (bad) console.log(process.argv[1], "appears no good (", e.node, ")") }' '{}' \; 

翻譯成普通樣式:

var fs = require("fs"); 

var contents = fs.readFileSync(process.argv[1]); 
var package = JSON.parse(contents); 
var engines = package.engines; 

if (engines && engines.node) { 
    var node = engines.node, 
     bad = false; 

    if (node.match(/<\s*0\.[0-8]([^.]|\.0)/)) { 
     // Looks like "< 0.8.0" or "< 0.8" (but not "< 0.8.1"). 
     bad = true; 
    } 

    if (node.match(/(^|[^>])=\s*0\.[^8]/)) { 
     // Looks like "= 0.7" or "= 0.9" (but not ">= 0.6"). 
     bad = true; 
    } 

    if (bad) { 
     console.log(process.argv[1], "appears no good (", node, ")"); 
    } 
} 

然後,使用find對每package.json我們可以發現運行此。

這裏就是我得到的,當我運行它在我的express-template.coffee包:

./node_modules/jade/node_modules/commander/package.json appears no good (>= 0.4.x < 0.8.0) 
./node_modules/mocha/node_modules/commander/package.json appears no good (>= 0.4.x < 0.8.0) 
./node_modules/mocha/package.json appears no good (>= 0.4.x < 0.8.0) 

看來TJ具有抗0.8 ;-)

+0

一件事,將不匹配<0.6,我認爲 – seppo0010

+0

OK,好的開始。和+1使用節點來搜索節點。但是,它有一點特殊性 - 但是你讓我接觸到了一些我可以與之合作的感謝。我會再給它一點時間,看看是否有人能想出一個通用的解決方案。在我的一個部署中,Jade和Commander失敗了。不好。我認爲這需要一段時間才能升級。 (哎呀,意識到你有相同的包裹失敗!) –

+0

當然,它只是指揮官。它嵌入到Jade和Socket.IO中雖然我手動檢查了一些其他的包,但其中很多或者沒有指定節點版本 - 考慮到它正在經歷的變化量是危險的 - 或者他們只是說「*」啊! –