2016-10-13 89 views
2

我已經構建了一個使用多個外部寶石的Thor CLI應用程序。當我運行它時,我收到來自那些混亂我的輸出的寶石的警告消息 - 我怎麼能抑制這一點?抑制Thor CLI應用程序中的警告消息

澄清:我希望抑制警告僅消息,但仍收到標準輸出爲我的應用程序,包括錯誤和puts結果。

例如,當我在我的Sinatra應用程序中使用這些相同的寶石時,我沒有像我對雷神那樣從寶石代碼中發出所有警告消息。

(從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寶石,每次我們運行一個命令,我們會得到我們的輸出以下警告:

/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: warning:重新定義方法;丟棄舊LOAD_FILE /usr/local/Cellar/ruby/2.3.0/lib/ruby/2.3.0/psych.rb:470:警告: 以前LOAD_FILE的定義在這裏

我們使用許多不同的寶石,並得到一整串警告,這些警告正在混淆我們的輸出...

+0

這將是很好的有一個代碼示例玩? –

+0

[KISS](https://en.wikipedia.org/wiki/KISS_principle)解決方法:修復警告。 – Blacksilver

回答

1

首先,您可能會提交Pull請求,並抑制依賴項中的消息或提出問題,要求gem開發人員進行排序它適合你

否則,這是我以前用過的東西 - 它可能是從某處SO(或互聯網我但我不記得在哪裏......但是我不記得在哪裏......

所以,你基本上把依賴的噪聲方法與silence方法相結合,該方法只是將STDOUT推送到StringIO對象,然後再回到標準輸出...

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... 
+0

另請參閱http://stackoverflow.com/questions/1496019/suppresing-output-to-console-with-ruby –

+0

我不好,我不清楚。我仍然需要標準輸出,我只是不希望警告消息從寶石中傳出。看到我上面的編輯... – Yarin

0

@Yarin,

上@伊斯梅爾的回答跟進,你可以通過重載新的「臨時」 StringIO的該silence方法中篩選出包含單詞「警告」的消息擴展這個解決方案。

下面是一個例子:

require 'stringio' 

class FooIO < StringIO 
     def puts s 
       super unless s.start_with? "WARN" 
     end 
end 

def silence 
    $stdout = temp_out = FooIO.new 
    yield 
    temp_out.string 
ensure 
    $stdout = STDOUT 
end 

def foo 
     puts "INFO : Hello World!" 
     puts "WARN : Oops.. This is a warning..." 
     puts "ALRT : EVERYONE IS GOING TO DIE!!!" 
end 

out = silence { foo } 

puts out 
0

Ruby有一個全局變量來定義輸出的冗長外。nil意味着沒有警告,false「正常」模式和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' } 

如果你有控制程序如何是運行,你可以改爲使用紅寶石的-W標誌與各自的值0,12(在這種情況下ruby -W 0)。