Ruby popen3和ANSI颜色

我试图让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颜色的脚本获取输出,并将其输出到控制台?

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

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

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

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

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

可以通过PTY模块在伪终端中运行命令,以便保持面向终端的行为的用户。 积分转到tty-command gem的创建者( 参见本期 ),他在gem中实现了这种行为:

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

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

Interesting Posts