2012-03-19 5 views
0

私はRubyRakeの経験を持っていますが、今はNodeプロジェクトに取り組んでおり、Jakeと同じことをする方法を学びたいと思っています。JakeのRakeの 'sh'に相当しますか?

Rubyにはsystemという機能があり、コマンドを実行して終了するのを待ちます。 Rakeはこれを拡張するために、sh関数を追加します。この関数は、子プロセスがゼロ以外の終了コードを返した場合(またはまったく見つからない場合)にエラーをさらにスローします。 shは、何かが失敗するとすぐに自動的にタスクを終了させるので、コンパイラやテストフレームワークのようなものにシェルするRakeタスクにとっては、本当に便利です。最寄りの等価物はchild_process.spawnchild_process.execているように見えますが、それらのいずれも、ワイヤアップSTDOUTやSTDERRを、あなたは子供から任意の出力を見ることができない -

ノードはsystemまたはshようなものを持っていないようですあなたが余分な仕事をしない限り、

Jakeのshメソッドを取得する最も良い方法は何ですか? (これはNodeなので、Rubyのようにコマンドが返るまでブロックするのではなく、非同期であると思っています)。この特定のホイールをすでに作成しているnpmモジュールがあるか、誰かがコードサンプルを持っていますか?この?

私は既にsh.jsを見ましたが、これは非常に重く見えます(ノード内にコマンドインタープリタ全体を構築しようとします)、非同期ではありません(ただし、または他のもの)。

私は(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モジュールを知っている場合でも、別の答えを追加してください。)

  • は完全なシェルの構文をサポートしていますので、あなたはパイプに|<>を使用することができますし、リダイレクト出力、Windowsバッチファイルなどを実行できます。
  • 子プロセスが出力を生成するときに出力(STDOUTとSTDERRの両方)を表示するので、コマンド実行時に増分出力が表示されます。
  • (このコードの以前のexecとは異なり)コマンドが生成できる出力の量に制限はありません。
  • クロスプラットフォーム(Windowsで動作し、Mac/Linuxでも動作するはずです)プラットフォーム固有シェル(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(); 
    }); 
}; 
関連する問題