我有一个执行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脚本的输出也着色?
从命令行:
来自ruby脚本:
更新
我能够使用script
bash command preserve color when piping
spec = `script -q /dev/null rake spec`
这仍然存在不实时滚动文本的缺点。虽然它确实保留了颜色,但直到最后它才输出任何东西。
是否有更原生的方式来执行此操作以允许滚动?
答案 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