トップ «前の日記(2009-09-19) 最新 次の日記(2009-09-22)» 編集

Route 477



2009-09-20

[rubystation] 連休中にリリースしたいのだが

「gem installの出力をブラウザにリアルタイムに出力する」ってところで詰まっている。 といってもlong-pollがどうのこうのではない。出力されたものをブラウザに表示するとこまではできてる*1

問題は、

  • gemコマンドの出力がSTDOUT.putsを利用していて
  • STDOUT.flushしてないので
  • コマンドの実行が終了してからしか文字列が読み出せない

こと。

stderrも取りたいので、通信にはopen3を使っている。単純化するとこんな感じ。

require 'open3'

cmd = "ruby -e '5.times{|i| STDOUT.puts i; sleep 1}'"

Open3.popen3(cmd){|i,o,e| i.close; o.each{|l| puts l} }

実行すると5秒後に全部の文字列が表示される。これを1秒ごとに表示されるようにしたい。

しかしコマンドラインからgem install ... とした場合はちゃんとリアルタイムに表示されるわけで、どうなってんのかな。出力がターミナルだったらバッファリングしないとかかな。


そもそもリアルタイムに出力する必要があるのかというとそうでもないんだけどw。ペンディングにしてリリースを優先すべきか。


もう一つ、パイプ使うんじゃなくて、gemのinstall_command.rbをそのまま利用する手もある。Ruby 1.9.x必須にするんだから、それでもいいのかもなぁ。 正式なAPIではないのでバージョン間の非互換踏むのが怖いが。

*1 1秒間隔でポーリングする

本日のツッコミ(全2件) [ツッコミを入れる]
morita (2009-09-23 08:58)

pty をつかうとよいです < 子プロセスの出力をとる<br>http://www.ruby-lang.org/ja/man/html/pty.html

yhara (2009-09-25 14:12)

ありがとうざいます!試してみます。