我正在为 Rails 开发编写一个基于 Web 的开发控制台。在我的一个控制器操作中,我调用了 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),有些似乎从未捕获输出(测试)。奇怪的。