如何将 STDOUT 重定向到 sinatra 网页

How to redirect STDOUT to sinatra webpage

我以前看过这个问题,但我很好奇如何使用 sinatra 来完成这个问题。认识到 sinatra already has a streaming method,我认为解决方案已经完成了 80%。

类似的题供参考:

通用重定向标准输出: Streaming stdout to a web page

使用 sinatra 流式传输标准输出(不适合我): Sinatra 1.3 Streaming w/ Ruby stdout redirection

这是我要完成的示例(为清楚起见进行了简化):

require 'sinatra'
require 'thin'

get '/' do
  stream do |out|
    out << method_that_puts
  end
end

def method_that_puts
  puts 'I would like...'
  sleep 1.0
  puts 'to display this...'
  sleep 1.0
  puts 'on a web page!'
end

编辑: 完美的例子是 travis-ci,即 also built with sinatra。他们正在将标准输出重定向到构建页面...这怎么可能?

更新:

感谢到目前为止的帮助,我有了一个半途而废的解决方案。我目前正在将 $stdout 保存到 StringIO 的新实例中,然后再显示它。但是,这不是答案。对于长 运行 脚本(即 travis-ci 构建),等待整个脚本完成然后显示 $stdout 是荒谬的。需要弄清楚如何在它出现时流式传输...

这是我目前的情况:

foo = StringIO.new
$stdout = foo

get '/' do
  stream do |out|
    method_that_puts
    out.puts $stdout.string
  end
end

def method_that_puts
  puts 'I would like...'
  sleep 1.0
  puts 'to display this...'
  sleep 1.0
  puts 'on a web page!'
end

您可以使用 Sinatra::Streaming(来自 sinatra-contrib gem),它提供了一个您可以写入的输出对象。

这是文档中的示例:

get '/' do
  stream do |out|
    out.puts "Hello World!", "How are you?"
    out.write "Written #{out.pos} bytes so far!\n"
    out.putc(65) unless out.closed?
    out.flush
  end
end