【问题标题】:Ruby popen3 and ANSI colourRuby popen3 和 ANSI 颜色
【发布时间】:2011-07-28 11:08:22
【问题描述】:

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

【问题讨论】:

    标签: ruby colors ansi-escape


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢汤姆,你指引我正确的方向,我通过运行 rspec 得到了它,如下所示:'rspec --tty --drb --color [path]' 显然 [path] 是您要运行的测试的路径。再次感谢,太好了。
    • --tty 参数为我做到了。
    【解决方案2】:

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

    The documentation 表示您可以使用--color 命令行选项强制颜色。

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

    【讨论】:

    • 抱歉,我应该指定 watchr 正在运行的命令是 'rspec --drb --colour --format nested [file_name_of_test]' 所以颜色是强制的。
    【解决方案3】:

    可以通过PTY module 在伪终端中运行命令,以保持面向用户的类似终端的行为。致谢 tty-command gem (see this issue) 的创建者,他在他的 gem 中实现了此行为:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 2012-12-17
      • 2016-05-06
      • 2011-03-18
      • 2014-10-11
      • 2018-09-30
      相关资源
      最近更新 更多