6

我试图让 watchr 在文件更改时自动运行测试,并且得到了我需要的大部分工作,除了来自 RSpec 的所有 ANSI 颜色都被忽略的事实。违规代码如下:

stdin, stdout, stderr = Open3.popen3(cmd)
stdout.each_line do |line|
  last_output = line
  puts line
end

当 cmd 等于类似的东西时rspec spec/**/*.rb,上面的代码运行 RSpec 很好,除了所有输出都是单色的。我已经研究过使用Kernel.system,但是系统没有返回我需要确定测试是否失败/成功的输出。如何获取从 Ruby 中执行的脚本的输出,包括 ANSI 颜色并将其输出到控制台?

4

3 回答 3

6

我猜想 rspec 正在检查它正在向其写入输出的流,以查看它是否是 tty(即控制台),如果不是,则禁用颜色。许多命令都这样做——例如 GNU ls 和 grep。由于从子进程到您的脚本的流不是 tty,因此颜色将被禁用。

希望 rspec 有一个标志,它将强制使用颜色,而不管流类型如何。如果没有,您将不得不诉诸一些真正奇怪的 stty 恶作剧。

于 2011-04-03T01:02:36.690 回答
5

rspec工具很有可能正在检查它是否在终端上以交互方式运行,或者在决定是否使用颜色输出之前从脚本自动运行。

文档--color说您可以使用命令行选项强制颜色。

试试:rspec --color spec/**/*.rb

于 2011-04-03T01:01:09.637 回答
1

可以通过PTY 模块在伪终端中运行命令,以保留面向用户的类似终端的行为。致谢tty-command gem 的创建者(见这个问题)在他的 gem 中实现了这个行为:

require 'tty-command'
cmd = TTY::Command.new(pty: true)
cmd.run('rspec', 'spec/**/*.rb')

请记住,使用伪终端可能会产生不必要的副作用,例如使用寻呼机git的某些命令实际上会导致命令挂起。因此,引入该功能可能是一个重大变化。

于 2017-11-26T18:54:55.220 回答