0

RubyRakeの経験はありますが、現在Nodeプロジェクトに取り組んでおり、Jakeで同じことを行う方法を学びたいと思っています。

Ruby にはsystem、コマンドをシェルアウトして終了するのを待つ関数があります。Rake はこれを拡張してsh、子プロセスがゼロ以外の終了コードを返した (またはまったく見つからなかった) 場合にさらにエラーをスローする関数を追加します。sh何かが失敗するとすぐにタスクを自動的に終了するため、コンパイラやテストフレームワークなどにシェルアウトする Rake タスクには非常に便利です。

systemNode にはorのようなものはないようですsh-- 最も近い同等のものはchild_process.spawnandのように見えますchild_process.execが、どちらも STDOUT または STDERR に接続されていないため、追加の作業を行わない限り、子プロセスからの出力は表示されません。

shジェイクのメソッドを取得する最良の方法は何ですか? (ただし、これは Node であるため、Ruby のようにコマンドが返されるまでブロックするのではなく、非同期であることを期待します。) この特定のホイールを既に発明した npm モジュールはありますか、または誰かがそれを行うコード サンプルを持っていますか?これ?

私はすでにsh.jsを見てきましたが、これは非常に重く見え (ノードでコマンドインタープリター全体を構築しようとします)、非同期のようには見えません (ただし、ドキュメントでは一方向または他の)。

私は多かれ少なかれこのように使用できるものを探しています(非同期タスクに対するジェイクのサポートを使用):

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);
4

1 に答える 1

0

ここに私が思いついた、うまくいくと思われるいくつかのコードがあります。(しかし、誰かがより良い答えを持っているか、すでにこれを行っている既存のnpmモジュールを知っている場合は、別の答えを追加してください。)

  • 完全なシェル構文をサポートしているため|、 and<とを使用し>て出力をパイプおよびリダイレクトしたり、Windows バッチ ファイルを実行したりできます。
  • 子プロセスが生成する出力 (STDOUT と STDERR の両方) を表示するため、コマンドの実行時に増分出力が表示されます。
  • コマンドが生成できる出力の量に制限はありません (execこのコードの以前の をベースにしたバージョンとは異なります)。
  • クロスプラットフォーム (Windows でも動作しますが、Mac/Linux でも動作するはずです)。npm からplatform-specific-shell( if platform === 'win32') 手法を借りました。

コードは次のとおりです。

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();
  });
};
于 2012-03-19T18:46:49.070 に答える