回答:
Rakeタスクは基本的にブロックです。ラムダを除くブロックはreturnをサポートしていませんがnext
、rakeタスクで使用する次のステートメントにスキップして、メソッドでreturnを使用するのと同じ効果があります。
task :foo do
puts "printed"
next
puts "never printed"
end
または、メソッド内でコードを移動し、メソッドでreturnを使用できます。
task :foo do
do_something
end
def do_something
puts "startd"
return
puts "end"
end
私は2番目の選択を好みます。
break
みましたが、このエラーが発生しました:レーキが中止されました!proc-closureからの中断(--traceを使用してタスクを実行して完全なトレースを表示)
next
から抜け出すためにブロックの「レベル」にあります場合にのみ機能します。
abort(message)
タスク内から使用して、メッセージでそのタスクを中止できます。
next
。大好きです。
私はabort
そのような状況でより良い代替手段である例えばを使用する傾向があります:
task :foo do
something = false
abort 'Failed to proceed' unless something
end
abort
、1
終了コードで終了せずにどうすればよいですか?多くの場合、Rakeタスクはコマンドラインで使用され、成功または失敗を判断します。「成功」はありabort
ますか?
exit
正常に終了するための良い方法のように見えます
あなたが戻っている場合にエラー(すなわちの終了コード1
)あなたが使用したいと思うabort
も、終了時に出力されますオプションの文字列のparamを取り、:
task :check do
# If any of your checks fail, you can exit early like this.
abort( "One of the checks has failed!" ) if check_failed?
end
コマンドラインで:
$ rake check && echo "All good"
#=> One of the checks has failed!
あなたが戻っている場合はなし(すなわちの終了コードエラー0
)あなたが使用したいと思うexit
どの、しない文字列のparamを取ります。
task :check do
# If any of your checks fail, you can exit early like this.
exit if check_failed?
end
コマンドラインで:
$ rake check && echo "All good"
#=> All good
これをcronジョブで使用する場合や、rakeタスクが成功したかどうかに基づいて後で何かを実行する必要がある場合に重要です。
「レーキを中止しました!」を引き起こさずにレーキタスクを終了するつもりなら メッセージを出力する場合は、「中止」または「終了」を使用できます。ただし、「abort」をレスキューブロックで使用すると、タスクが終了し、エラー全体が出力されます(--traceを使用しなくても)。つまり、「exit」が私が使用するものです。
next
レーキタスクをテストするときabort
、実際にはのラッパーにすぎexit
ないは望ましい動作ではないため、私はSimone Carlettiが提案したアプローチを使用しました。
例:
task auto_invoice: :environment do
if Application.feature_disabled?(:auto_invoice)
$stderr.puts 'Feature is disabled, aborting.'
next
end