2016-10-13 15 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:90: warning: Предыдущее определение 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

Было бы неплохо иметь пример кода, с которым можно поиграть? –

+0

[KISS] (https://en.wikipedia.org/wiki/KISS_principle) решение: исправить предупреждения. – Blacksilver

ответ

1

Во-первых, вы можете представить запрос Pull и подавить сообщение в зависимости или вызвать проблему, требуя от разработчиков драгоценных камней сортировки это для вас

В противном случае это то, что я использовал раньше - это, вероятно, откуда-то на SO (или в Интернете i n вообще), но я не могу вспомнить, где ...

Итак, вы в основном обертываете шумный метод из зависимости с помощью метода 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... 
+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

рубин имеет глобальную переменную для определения уровня подробности вывода.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, 1 или 2 (в данном случае ruby -W 0).

 Смежные вопросы

  • Нет связанных вопросов^_^