我已经构建了一个使用许多外部宝石的Thor CLI应用程序。当我运行它时,我收到来自那些使我的输出混乱的宝石的警告信息 - 我该如何抑制它?
澄清:我想仅取消警告消息,但仍会收到我的应用的标准输出,包括错误和puts
结果。
例如,当我在我的Sinatra应用程序中使用这些相同的宝石时,我没有像使用Thor那样从宝石代码中获得所有警告消息。
示例(源自http://willschenk.com/making-a-command-line-utility-with-gems-and-thor/)
require 'thor'
require 'safe_yaml'
module Socialinvestigator
class HammerOfTheGods < Thor
desc "hello NAME", "This will greet you"
long_desc <<-HELLO_WORLD
`hello NAME` will print out a message to the person of your choosing.
HELLO_WORLD
option :upcase
def hello( name )
greeting = "Hello, #{name}"
greeting.upcase! if options[:upcase]
puts greeting
end
end
end
在这种情况下,因为我们需要safe_yaml
gem,所以每次运行命令时我们都会在输出中收到以下警告:
/usr/local/lib/ruby/gems/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml.rb:28: 警告:方法重新定义;丢弃旧的safe_load /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/psych.rb:290:警告: safe_load的先前定义在这里 /usr/local/lib/ruby/gems/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml.rb:52: 警告:方法重新定义;丢弃旧的load_file /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/psych.rb:470:警告: load_file的先前定义在这里
我们正在使用许多不同的宝石,并获得一系列混乱我们输出的警告......
答案 0 :(得分:1)
首先,您可以提交Pull请求并禁止依赖项中的消息,或者提出一个问题,要求gem开发人员为您排序
否则,这是我以前用过的东西 - 它可能来自SO(或一般的互联网)的某个地方,但我不记得在哪里......
所以你基本上用一个silence
方法从依赖中包装噪声方法,它只是将STDOUT推送到一个StringIO对象,然后再返回到STDOUT ......
require 'stringio'
def silence
$stdout = temp_out = StringIO.new
yield
temp_out.string
ensure
$stdout = STDOUT
end
out = silence { run_dependency_method }
puts out # if in dev mode etc...
答案 1 :(得分:1)
Ruby有一个全局变量来定义输出的详细程度。 nil
表示没有警告,false
是&#34;正常&#34; 模式,true
是额外的详细信息(添加一些额外的运行时信息,相当于正在运行ruby --verbose
):
def without_warnings
verboseness_level = $VERBOSE
$VERBOSE = nil
yield
ensure
$VERBOSE = verboseness_level
end
# Doesn't show warnings about overwriting the constant
without_warnings do
Foo = 42
Foo = 'bar'
end
# Still shows normal output
without_warnings { puts 42 }
# Still shows and throws errors
without_warnings { raise 'wtf' }
如果您可以控制程序的运行方式,则可以使用ruby的-W
标记,其值分别为0
,1
或2
(在这种情况下ruby -W 0
)。
答案 2 :(得分:0)
@Yarin,
跟进@ Ismail的回答,您可以通过在private ArrayList<Product> producten;
private int id;
private String productName;
private String image;
private String description;
private int price;
private int stock;
public String addProduct() {
//imageLocation = image.
Product p = new Product(0, imageLocation, productName, description, price, stock);
DAOProduct.getInstance().createProduct(p);
return SUCCESS;
}
方法中重载新的“临时”StringIO来扩展此解决方案,以过滤掉包含“警告”一词的消息。
以下是一个例子:
silence