gpt4 book ai didi

ruby-on-rails - 使用 Ruby 脚本调用时如何捕获 Rake 输出?

转载 作者:行者123 更新时间:2023-12-04 12:01:52 26 4
gpt4 key购买 nike

我正在为 Rails 开发编写一个基于 Web 的开发控制台。在我的 Controller 操作之一中,我正在调用 Rake,但我无法捕获 Rake 生成的任何输出。例如,以下是来自 Controller 的一些示例代码:

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),而有些似乎永远不会捕获输出(测试)。奇怪的。

最佳答案

虽然这是一种 hack(因为 Rack 是用 ruby​​ 编写的),但您可以使用 open3 的 popen3方法并像从命令行一样调用 rake 任务。

在你的情况下,你会像那样使用它

require 'open3'

buffer = []
Open3::popen3("rake db:migrate:redo") do |stdin,stdout,stderr|
begin
while line = stdout.readline
buffer << line
end
rescue
end
end

所以你最终会得到所有在 buffer 中 rake 返回到标准输出的行。 .也许这更可靠,但我建议调查奇怪行为的来源
你描述。

关于ruby-on-rails - 使用 Ruby 脚本调用时如何捕获 Rake 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1394090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com