我正在为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
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我无法捕获Rake输出?我试过通过Rake源代码,我无法看到它在哪里触发新进程或任何东西,所以我认为我应该能够做到这一点.
非常感谢!阿德里安
我已经发现从Ruby内部调用Rake的正确方法可以更好地工作:
Rake.application['db:migrate:redo'].reenable
Rake.application['db:migrate:redo'].invoke
Run Code Online (Sandbox Code Playgroud)
奇怪的是,一些rake任务现在完美地工作(路由),一些在第一次运行时捕获输出,之后总是空白(db:migrate:redo),有些甚至没有捕获输出(测试).奇.
嗯,我知道 ZenTest 能够通过“until_capture”捕获“puts”语句,我什至发现有人通过扩展内核模块并将 $stdout 重定向到 StringIO 实例来编写自定义实现。
希望有帮助:
http ://thinkingdigitally.com/archive/capturing-output-from-puts-in-ruby/
您可能还想查看 Matthias Hennemeyer 的 OutputCatcher:
http://github.com/mhennemeyer/output_catcher
| 归档时间: |
|
| 查看次数: |
6250 次 |
| 最近记录: |