2016-03-15 91 views
0

我想创建一个gem来过滤Ruby中的警告,并且我想为“语法”和“运行时”警告执行此操作。我很努力工作,如何它可以过滤语法级别警告(或者如果可能的话)过滤红宝石警告

例如,如果我运行下面的脚本

# myscript.rb 
@blah 

ruby -w myscript.rb

myscript.rb:1: warning: possibly useless use of a variable in void context 
myscript.rb:1: warning: instance variable @blah not initialized 

现在,想象这是更大项目的一部分。我想从myscript中滤除任何警告。我会如何去做这件事?运行时错误将很容易过滤使用ActiveSupport中的silence_warnings样式代码https://github.com/rails/rails/blob/3be9a34e78835a8dafc3438f60afb412613773b9/activesupport/lib/active_support/core_ext/kernel/reporting.rb

但我不知道如何(或者如果可能的话)钩入Rubys语法级别的警告,因为它似乎是他们会运行之前你有机会猴子修补任何东西。我所能想到的是将ruby脚本包装在另一个将过滤所有警告的进程中。例如:

myfilterprogram ruby -w myscript.rb然后它会捕获任何打印到STDERR并相应地过滤的东西。

回答

1

在读取主文件之前,您可能无法进行猴子修补,但可以在完成monkeypatching之后使主文件调用子文件。

myruby(可执行文件)

#!/usr/bin/env ruby 

module Kernel 
    def warn *args 
    args # => captured warnings 
    end 
end 

load ARGV[0] 

用法为:

myruby foo.rb 
+1

这是个好主意..我想最好做的是运行测试套件的应用程序,(例如'bundle exec rake'),所以我将不得不看看我的优秀建议是否能在这些范围内工作。我想如果有一种方法可以通过编程的方式调用rspec来启动测试套件,那么它会很好。在此期间,我会将此标记为正确的!谢谢 :) –