私は別のツール、すなわちシェルコマンドを実行していくつかのテストを実行するThorスクリプトを作成しています。私はコマンドからstdoutとstderrが私のコンソールに連続的に流出したいと思います。Thor:stdoutまたはstderrをキャプチャせずにコマンドを実行し、エラーで失敗する
最初の試みは、バッククォートを使用することでしたが、当然、stdout/stderrは表示されません(むしろstdoutは戻り値に取り込まれます)。
desc "mytask", "my description"
def mytask
`run-my-tests.sh`
end
私の次のアプローチは、のようにのopen3を使用していた:
require "open3"
desc "mytask", "my description"
def mytask
Open3.popen3("run-my-tests.sh") do |stdin, stdout, stderr|
STDOUT.puts(stdout.read())
STDERR.puts(stderr.read())
end
end
しかし、上記のアプローチは、stdoutとstderrの両方からの全出力を取得し、唯一の最後に印刷されます。私のユースケースでは、むしろ失敗し合格したテストの出力が利用可能になるのを見るでしょう。
http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.htmlから、read()
の代わりにgets()
を使用してストリームを読み取ることができました。例:
require "open3"
desc "mytask", "my description"
def mytask
Open3.popen3(command) do |stdin, stdout, stderr|
while (out = stdout.gets()) || err = (stderr.gets())
STDOUT.print(out) if out
STDERR.print(err) if err
end
exit_code = wait_thr.value
unless exit_code.success?
raise "Failure"
end
end
end
これは最善のアプローチです。それは私が手動で stderrの前にstdoutを印刷しようとする必要がある問題ですか?
私はそうのように、同様のタスクのIO.popen
を使用してい
stdoutとstderrを監視するには 'IO.select'を使うべきです。 – Stefan