在Thor CLI app

时间:2016-10-13 17:15:14

标签: ruby command-line-interface stdout thor

我已经构建了一个使用许多外部宝石的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的先前定义在这里

我们正在使用许多不同的宝石,并获得一系列混乱我们输出的警告......

3 个答案:

答案 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标记,其值分别为012(在这种情况下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