2013-06-21 22 views
8

我是Thor(和Ruby)的新手,我正在考慮在構建腳本中使用它,因爲它表示它可以替代Rake(因此可以替換爲Rake )。但是經過短暫的試用後,我對它返回的錯誤狀態感到困惑。我很快瀏覽了wiki,但沒有看到任何提及。如果發生錯誤,Ruby/Thor退出狀態

只需第一 「簡單實施例」,test.thor

class Test < Thor 
    desc "example", "an example task" 
    def example 
    puts "I'm a thor task!" 
    end 
end 

版本#:

eruve>thor version 
Thor 0.18.1 

我試圖故意下面,一個錯誤的命令:

eruve>ruby --version; thor test:example badarg; echo exit status: $? 

ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin10.8.0] 
ERROR: thor example was called with arguments ["badarg"] 
Usage: "thor test:example". 
exit status: 0 

所以,出現了一個錯誤,但它以0的狀態退出......意味着我寧願不用它在(n on-ruby)腳本,否則腳本會繼續運行,即使應該終止。隨後的錯誤可能難以分析。

我必須失去了一些東西,所以我的問題:

  • 有一種簡單的方法來獲得在發生錯誤的情況下默認爲非零狀態(配置文件等)?

  • 如果不是,我應該怎麼做才能正確嗎?

謝謝。

回答

2

(非常感謝@fontno),並在我的身邊更多的調查,這裏是一個黑客爲了讓它與一個普通的shell一起工作。警告:它不是優雅的,打印出異常堆棧垃圾,但我認爲這是可行的(請不要猶豫,告訴我否則)。

class Thorough < Thor 
    ENV["THOR_DEBUG"] = "1" 
    check_unknown_options! 
private 
    def subcommand(*_) super subcommand(*_) 
    rescue Thor::Error => e 
    $stderr.puts e.message 
    exit 1 
    end 
end 

class Test < Thor#ough 
    desc "example", "an example task" 
    def example 
    puts "I'm a thor task!" 
    end 
end 

如上所述,它具有與以前相同的行爲(我相信)。現在,在從Thor#ough移除#之後,如果Thor已經提出了Error,則它應該退出狀態1,從而允許來自例如一個非紅寶石外殼。

eruve>thor test:example badarg; echo $? 
/Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/base.rb:482:in `handle_argument_error': ERROR: thor example was called with arguments ["badarg"] (Thor::InvocationError) 
Usage: "thor test:example". 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:35:in `rescue in run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:21:in `run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/base.rb:439:in `start' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/runner.rb:36:in `method_missing' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:29:in `run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/command.rb:128:in `run' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/lib/thor/base.rb:439:in `start' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/gems/thor-0.18.1/bin/thor:6:in `<top (required)>' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/thor:23:in `load' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/thor:23:in `<main>' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/ruby_noexec_wrapper:14:in `eval' 
    from /Users/eruve/.rvm/gems/ruby-2.0.0-p195/bin/ruby_noexec_wrapper:14:in `<main>' 
1 

eruve>thor test:example; echo $? 
I'm a thor task! 
0 

eruve>thor test:example badarg 2>/dev/null; echo $? 
1 

乾杯。 PS:我想知道,Thor有很多這樣的陷阱嗎?如果這是一種預期的行爲,其目的/理念與我的項目需求不相容......黑客並不是可靠的解決方案。

1

好問題。當看到thor用於項目時,我也注意到了這一點。據我所知,這是預期的行爲。這pull request for bundler有一個有趣的解決方案,可能適合你。

他們啓用了雷神調試標誌,使他們能夠根據捆綁的解決方案捕獲錯誤,並設置相應的退出狀態

# bin/bundle 

Bundler.with_friendly_errors { 
    # Set debug flag so we can rescue Thor::error's 
    # and set the correct exit code. 
    ENV["THOR_DEBUG"] = "1" 
    Bundler::CLI.start 
} 


# friendly_errors 

rescue Thor::UndefinedCommandError => e 
    Bundler.ui.error e.message 
    exit 15 
    rescue Thor::Error => e 
    Bundler.ui.error e.message 
    exit 1 
+0

+1因爲它導致了黑客(請參閱我的答案),儘管這不是直接可用的,特別是作爲Ruby之外的解決方案。 – eruve

18

我知道這已經得到了回答,但我認爲這是一個更好的答案,所以我想我會貢獻它無論如何。

Thor有一個方法可以用來改變行爲,所以錯誤會導致非零的退出代碼。它沒有很好記錄(恕我直言)。

class Test < Thor 
    def self.exit_on_failure? 
    true 
    end 

    desc "example", "an example task" 
    def example 
    puts "I'm a thor task!" 
    end 
end 

默認值是莫名其妙的false。我不知道爲什麼有人會希望它的行爲像個人。 Thor issue 244也解決了這個問題。

+0

這應該是被接受的答案 –