Answers:
Rake任务基本上是一个块。除了lambdas以外,一个块不支持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
我更喜欢第二选择。
break
,但遇到了这个错误:耙子中止了!从proc-closure中断(通过使用--trace运行任务查看完整的跟踪信息)
next
仅在要突破的“级别”上有效
您可以abort(message)
从任务内部使用消息中止该任务。
next
。爱它。
如果你正在返回与错误(即退出代码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
,它不会使用字符串参数。
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任务是否成功而需要在事后执行某些操作,则这一点很重要。
如果需要突破多个块级别,可以使用fail。
例如
task :something do
[1,2,3].each do |i|
...
fail "some error" if ...
end
end
我使用next
了Simone Carletti建议的方法,因为在测试rake任务时,abort
实际上这只是一个包装。exit
,这并不是期望的行为。
例:
task auto_invoice: :environment do
if Application.feature_disabled?(:auto_invoice)
$stderr.puts 'Feature is disabled, aborting.'
next
end