2013-12-19 75 views
0

在我們的環境中,我們正在構建一個build/util工具,供許多用戶使用,無需外部(或系統範圍)依賴項。也就是說,我們正在嘗試構建這個模型,以便用戶不必關心他們在全局安裝的node.js版本,因爲我們在工具目錄中打包了node.js二進制文件。 (請不要評論這種方法的優點)。Node.js,Bash腳本和目錄本地節點二進制文件

我們的刀具結構是這樣:

/web/tool/ 
/web/tool/bin/ (where the node binary lives) 
/web/tool/node_modules 

我們/網絡/工具/斌在任一執行腳本添加到$ PATH變量(第一順序)或grunt.js任務確保本地二進制文件路徑勝過其他文件。

執行任何bash腳本或grunt.js任務後,初始任務將查找正確的節點二進制文件。這是在沒有全局安裝節點的環境中測試的,所以我們知道它找到了目錄本地節點二進制文件。然而,從這些腳本/ grunt-tasks中產生的任何後續進程都在全局尋找節點二進制文件。

我們特定的用戶案例是通過一個咕嚕任務運行karma和phantomjs。在bash腳本/對因果報應箱,咕嚕-CLI(呼嚕聲),並phantomjs都具有

#!/usr/bin/env node 

熟悉的頭指令我們應該如何去建立,使我們的工具一直在尋找的目錄,本地節點二進制,即使在後續的子進程?

+0

你可以編寫一個包裝腳本來查找'node'二進制文件並執行諸如'export NODE =/web/tool/bin/node'之類的操作來設置環境變量爲本地NodeJS二進制文件腳本? –

+0

爲什麼後續進程必須全局查找節點,如果您有要執行第一個進程的節點的二進制文件的路徑名?也聽起來像nodejs virtualenv,所以你嘗試http://stackoverflow.com/questions/3653495/is-there-an-virtual-environment-for-node-js? – leorex

+0

@MichaelTang這是問題的關鍵。我們可以暫時爲一個命令改變envars,但隨後的子進程不會看到它。 – shellscape

回答

0

絕對嘗試創建一個包裝腳本來設置環境變量要傳遞給子類:

node ./wrapper.js(你寫/執行此一個)

#!/usr/bin/env node 

console.log(process.env.NODE); // "/usr/local/bin/node" 

process.env.NODE = "/web/tool/bin/node"; 

require('child_process').exec('node ./child.js', { 
    'cwd': __dirname, 
    'env': process.env 
}, function(err, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
    console.log('stderr: ' + stderr); 
    if (err !== null) { 
     console.log('exec error: ' + error); 
    } 
}); 

child.js(或者你有其他腳本,請注意,它並不需要進行修改)

#!/usr/bin/env node 

console.log(process.env.NODE); 

輸出:

$ node env.js 
/usr/local/bin/node 
stdout: /web/tool/bin/node (from child.js) 

stderr: 
+0

標記爲答案,因爲它解決了原始問題。儘管我們已經採用了不同的解決方案,並且實施了nodeenv ekalinin.github.io/nodeenv/,該解決方案解決了我們所有的擴展問題。 – shellscape