2013-06-21 15 views
8

私はThor(およびRuby)の新機能で、ビルドスクリプト内での使用を検討しています。 )。 しかし、短期間の試行の後、私はそれが返すエラー状態について混乱しています。私はすぐに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 

I試みた目的で、次の、誤ったコマンド:

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 Ruby上で)スクリプトを実行する必要があります。そうしないと、スクリプトは終了しても実行を継続します。その後のエラーは分析するのが難しいかもしれません。

  • エラーが発生した場合には、デフォルトでは非ゼロのステータスを取得する簡単な方法があります(設定ファイルには、など):

    私は私の質問したがって、何かが欠けする必要がありますか?

  • もしそうでなければ、私はそれを正しくするために何をすべきですか?

ありがとうございます。

答えて

2

適切な終了ステータスを設定します(多くのおかげ@fontno)、そして私の側に多くの調査ができるよう、ここにあるトールのデバッグフラグを有効にそれを通常のシェルで動作させるためにハックします。警告:それは優雅ではない、例外スタックのクラップを表示しますが、私はそれが動作すると思います(別に教えてください)。

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には、エラーによってゼロ以外の終了コードが発生するように動作を変更する方法があります。非常にうまく文書化されていません(IMHO)。

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

これは受け入れられる回答である必要があります –

関連する問題