Rails開発用のWebベースの開発コンソールを書いています。コントローラーアクションの1つで、Rakeを呼び出していますが、Rakeが生成する出力をキャプチャできません。たとえば、コントローラーからのサンプルコードを次に示します。
require 'rake'
require 'rake/rdoctask'
require 'rake/testtask'
require 'tasks/rails'
require 'stringio'
...
def show_routes
@results = capture_stdout { Rake.tasks['routes'].invoke }
# @results is nil -- the capture_stdout doesn't catpure anything that Rake generates
end
def capture_stdout
s = StringIO.new
$stdout = s
yield
s.string
ensure
$stdout = STDOUT
end
Rakeの出力をキャプチャできない理由を誰かが知っていますか?Rakeソースを調べてみましたが、新しいプロセスなどがどこで発生するかわからないので、これができるはずだと思います。
どうもありがとう!エイドリアン
それ以来、Rubyの内部からRakeを呼び出す正しい方法を発見しました。これは、はるかにうまく機能します。
Rake.application['db:migrate:redo'].reenable
Rake.application['db:migrate:redo'].invoke
不思議なことに、一部のrakeタスクは現在完全に機能し(ルート)、最初の実行時に出力をキャプチャし、その後は常に空白になり(db:migrate:redo)、出力をキャプチャしないように見えるものもあります(テスト)。奇数。