使用 popen3 实时输出 rake 任务
Real-time output of a rake task with popen3
在获得实时输出的同时从 popen3
块中 运行 rake 任务似乎是不可能的。所有行在 rake 任务结束时立即出现。我正在尝试通过 popen3
块
从 rake 任务中获取实时输出
cmd = 'rake perform_a_task'
Open3::popen3(cmd) do |std_in, std_out, std_err|
std_out.each_line do |line|
puts line
end
end
如何重现
概念验证:rake 任务
- 创建如下任务
task :print_and_wait do
puts 'A'
sleep 1
puts 'B'
sleep 1
putc 'C'
end
- 从命令行调用任务
$ rake print_and_wait
输出 3 行(A、B 和 C),中间有 1 秒的停顿。不出所料
概念验证 2:popen3
- 创建一个shell脚本
$ cat print_and_wait
#!/bin/bash
echo 'A'
sleep 1
echo 'B'
sleep 1
echo 'C'
- 创建一个 ruby 代币
$ cat print_and_wait.rb
require 'open3'
def exec_async(cmd)
Open3::popen3(cmd) do |std_in, std_out, std_err|
std_out.each_line do |line|
puts line
end
end
end
exec_async './print_and_wait'
- 运行 ruby 脚本
$ ruby print_and_wait.rb
按预期工作:输出 3 行,中间停顿一秒
哪里不行
- 编辑 ruby 脚本 print_and_wait.rb 并将
exec_async './print_and_wait'
更改为 exec_async 'rake print_and_wait'
- 运行
$ ruby print_and_wait.rb
- 无输出,3 秒后同时打印 3 行
我尝试了几种组合,但始终无法使其按预期工作。知道为什么这不起作用吗?这是一个错误吗?
谢谢
在 rake 任务的开头添加 $stdout.sync = true
解决了它。
在获得实时输出的同时从 popen3
块中 运行 rake 任务似乎是不可能的。所有行在 rake 任务结束时立即出现。我正在尝试通过 popen3
块
cmd = 'rake perform_a_task'
Open3::popen3(cmd) do |std_in, std_out, std_err|
std_out.each_line do |line|
puts line
end
end
如何重现
概念验证:rake 任务
- 创建如下任务
task :print_and_wait do
puts 'A'
sleep 1
puts 'B'
sleep 1
putc 'C'
end
- 从命令行调用任务
$ rake print_and_wait
输出 3 行(A、B 和 C),中间有 1 秒的停顿。不出所料
概念验证 2:popen3
- 创建一个shell脚本
$ cat print_and_wait
#!/bin/bash
echo 'A'
sleep 1
echo 'B'
sleep 1
echo 'C'
- 创建一个 ruby 代币
$ cat print_and_wait.rb
require 'open3'
def exec_async(cmd)
Open3::popen3(cmd) do |std_in, std_out, std_err|
std_out.each_line do |line|
puts line
end
end
end
exec_async './print_and_wait'
- 运行 ruby 脚本
$ ruby print_and_wait.rb
按预期工作:输出 3 行,中间停顿一秒
哪里不行
- 编辑 ruby 脚本 print_and_wait.rb 并将
exec_async './print_and_wait'
更改为exec_async 'rake print_and_wait'
- 运行
$ ruby print_and_wait.rb
- 无输出,3 秒后同时打印 3 行
我尝试了几种组合,但始终无法使其按预期工作。知道为什么这不起作用吗?这是一个错误吗?
谢谢
在 rake 任务的开头添加 $stdout.sync = true
解决了它。