2012-03-19 39 views
0

我有RubyRake的一些經驗,但現在我正在做一個Node項目,並且想要學習如何用Jake做同樣的事情。Rake的'sh'等於Jake嗎?

Ruby有一個system函數,該函數將放出一個命令並等待它退出。 Rake通過添加一個sh函數來擴展此功能,如果子進程返回非零退出代碼(或根本找不到),則該函數將另外拋出一個錯誤。對於Rake任務而言,sh非常方便,因爲Rake任務會在編譯器或測試框架等事物中脫穎而出,因爲它會在任何失敗後自動終止任務。

節點似乎不會有什麼像systemsh - 它看起來像最近的等效是child_process.spawnchild_process.exec,但他們都沒有電線連接起來stdout或stderr,所以你不能看到孩子的任何輸出除非你做了一些額外的工作。

爲傑克獲得sh方法的最佳方法是什麼? (雖然因爲這是Node,所以我希望它是異步的,而不是像Ruby那樣直到命令返回時才被阻塞。)是否有一個npm模塊已經發明瞭這個特定的輪子,還是有人有一個代碼示例這個?

我已經看到sh.js,但它看起來非常重量級(它試圖在Node中構建一個完整的命令解釋器),它看起來不像是異步的(儘管文檔沒有說一種方法或其他)。

我正在尋找的東西,我可以用更多或更少的這樣的(用傑克的支持async tasks):

file('myprogram', ['in.c'], function() { 
    // sh(command, args, successCallback) 
    sh('gcc', ['in.c', '-o', 'myprogram'], function() { 
     // sh should throw if gcc couldn't be found or returned nonzero. 
     // So if we got here, we can tell Jake our task completed successfully. 
     complete(); 
    }); 
}, true); 

回答

0

下面是一些代碼,我拿出這似乎運作良好。 (但是,如果任何人有一個更好的答案,或者說已經這樣做了一個現有的NPM模塊都知道,請添加另一個答案。)

  • 支持完整的shell語法,所以你可以使用|<>管道和重定向輸出,可以運行Windows批處理文件等。
  • 當子進程生成它時顯示輸出(包括STDOUT和STDERR),因此您可以在命令運行時看到增量輸出。
  • 對命令可以生成的輸出量沒有限制(與此代碼的以前版本exec不同)。
  • 跨平臺(適用於Windows,也適用於Mac/Linux)。我借用了平臺專用shell(if platform === 'win32')技術from npm

下面的代碼:

function sh(command, callback) { 
    var shell = '/bin/sh', args = ['-c', commandLine], child; 
    if (process.platform === 'win32') { 
    shell = 'cmd'; 
    args = ['/c', commandLine]; 
    } 
    child = child_process.spawn(shell, args); 
    child.stdout.pipe(process.stdout); 
    child.stderr.pipe(process.stderr); 
    child.on('exit', function(code, signal) { 
    if (signal != null) 
     throw new Error("Process terminated with signal " + signal); 
    if (code !== 0) 
     throw new Error("Process exited with error code " + code); 
    callback(); 
    }); 
};