Ruby - 打印颜色输出

时间:2014-09-25 20:00:35

标签: ruby shell guard

我有一个执行rake命令的ruby脚本(Guardfile)。

guard :shell do

  watch(%r{^manifests\/.+\.pp$}) do |m|
    spec = `rake spec`
    retval = $?.to_i
    case retval
    when 0
       if spec.length > 0 then
          puts spec
          n "#{m[0]} Tests Failed!", 'Rake Spec', :pending         
       else
          puts spec
          n "#{m[0]} Tests Passed!", 'Rake Spec', :pending

       end
    end
end

当我从命令行运行'rake spec'时,输出会着色。 我怎么能这样做,以便ruby脚本的输出也着色?

从命令行:

enter image description here

来自ruby脚本:

enter image description here

更新

我能够使用script

解决问题

bash command preserve color when piping

spec = `script -q /dev/null rake spec`

这仍然存在不实时滚动文本的缺点。虽然它确实保留了颜色,但直到最后它才输出任何东西。

是否有更原生的方式来执行此操作以允许滚动?

2 个答案:

答案 0 :(得分:2)

首先,rake spec --color无法正常工作,因为您已将--color传递给rake,而不是rspec

Jay Mitchell关于颜色的建议应该有效 - 将其放在.rspec文件中:

--color

至于生活"输出,guard-shell有一个eager命令:

https://github.com/guard/guard-shell/blob/master/lib/guard/shell.rb#L37-L51

不幸的是,guard-shell有两个重要缺点:

  • 它不允许您访问退出代码

  • 它没有正确报告Guard中的失败(导致其他任务运行)

因此,Guard :: Shell的eager方法对我们的需求毫无用处。

相反,以下内容应该有效:

# a version of Guard::Shell's 'eager()' which returns the result
class InPty
  require 'pty'

  def self.run(command)
    PTY.spawn(command) do |r, w, pid|
      begin
        $stdout.puts
        r.each {|line| $stdout.print line }
      rescue Errno::EIO
      end
      Process.wait(pid)
    end

    $?.success?
  rescue PTY::ChildExited
  end
end

# A hack so that Guard::Shell properly throws :task_has_failed
class ProperGuardPluginFailure
  def to_s
    throw :task_has_failed
  end
end

guard :shell, any_return: true do
  watch(%r{^manifests\/.+\.pp$}) do |m|
    ok = InPty.run('rake spec')
    status, type = ok ? ['Passed', :success] : ['Failed', :failed]
    n "#{m[0]} Tests #{status}!", 'Rake Spec', type
    ok ? nil : ProperGuardPluginFailure.new
  end
end

上面看起来很适合新的防护插件 - 好主意?

答案 1 :(得分:-1)

我对Guardfiles不熟悉。你能用宝石吗?着色宝石很棒。

https://github.com/fazibear/colorize

安装它:

$ sudo gem install colorize

使用它:

require 'colorize'

puts "Tests failed!".red
puts "Tests passed!".green