web-dev-qa-db-ja.com

Ruby rakeでタスクを明示的に失敗させる方法は?

私がこのようなrakefileを持っているとしましょう:

file 'file1' => some_dependencies do
  sh 'external tool I do not have control over, which sometimes fail to create the file'
  ???
end

task :default => 'file1' do
  puts "everything's OK"
end

ここで、???の代わりに何も指定しないと、外部ツールがファイルの生成に失敗しても、OKメッセージが表示されます。 rakeに通知する適切な方法は何ですか、「file1」タスクは失敗し、中止する必要があります(うまくいけば、どのタスクが失敗したかなどの意味のあるメッセージが表示されます)。ただ正しくないようです。

P.Sツールは常に終了コードとして0を返します。

48
dahpgjgamgan

他のRubyスクリプト(raisefailのエイリアスです)の場合と同様に、failまたはraiseメソッドを使用します)。このメソッドは、スクリプトの終了時に表示されるエラーメッセージとして使用される引数として文字列または例外を受け取ります。これにより、スクリプトは呼び出し元のシェルに値1を返します。ドキュメントに記載されています here およびその他の場所。

59
Richard Cook

abort("message")を使用して、rakeタスクを正常に失敗させることができます。

messageをstdoutに出力し、コード1で終了します。

終了コード1は、Unixライクなシステムでの失敗です。

詳細は Kernel#abort を参照してください。

16
Senid