我有一个rake任务,我在开始时做一些检查,如果其中一个检查失败,我想从rake任务提前返回,我不想执行任何剩余的代码.
我认为解决方案是在我希望从代码返回的地方放置一个返回但是我得到以下错误
unexpected return
Run Code Online (Sandbox Code Playgroud)
Sim*_*tti 272
Rake任务基本上是一个块.除lambda之外的块不支持返回,但是您可以跳到下一个语句,使用next
rake任务在方法中使用return具有相同的效果.
task :foo do
puts "printed"
next
puts "never printed"
end
Run Code Online (Sandbox Code Playgroud)
或者您可以在方法中移动代码并在方法中使用return.
task :foo do
do_something
end
def do_something
puts "startd"
return
puts "end"
end
Run Code Online (Sandbox Code Playgroud)
我更喜欢第二种选择.
小智 171
您可以abort(message)
在任务内部使用该消息中止该任务.
khe*_*lll 20
abort
在这种情况下,我倾向于使用哪种更好的选择,例如:
task :foo do
something = false
abort 'Failed to proceed' unless something
end
Run Code Online (Sandbox Code Playgroud)
mjs*_*mjs 11
如果您需要突破多个块级别,则可以使用fail.
例如
task :something do
[1,2,3].each do |i|
...
fail "some error" if ...
end
end
Run Code Online (Sandbox Code Playgroud)
Jos*_*ter 10
如果你正在返回与错误(即退出代码1
),你要使用abort
,这也需要一个可选的字符串PARAM,将获得在退出输出:
task :check do
errors = get_errors
abort( "There are #{errors.count} errors!" ) if errors.any?
# Do remaining checks...
end
Run Code Online (Sandbox Code Playgroud)
在命令行上:
$ rake check && echo "All good"
#=> There are 2 errors!
Run Code Online (Sandbox Code Playgroud)
如果您返回的消息没有错误(即退出代码为0
),则需要使用exit
,而该参数不需要字符串参数。
task :check do
errors = get_errors
exit if errors.empty?
# Process errors...
end
Run Code Online (Sandbox Code Playgroud)
在命令行上:
$ rake check && echo "All good"
#=> All good
Run Code Online (Sandbox Code Playgroud)
如果您要在cron作业中使用此功能,或者需要根据rake任务是否成功进行事后处理,则这一点很重要。
如果你的意思是退出rake任务而不会导致"rake aborted!" 要打印的消息,然后您可以使用"中止"或"退出".但是,当在救援块中使用时,"abort"会终止任务并打印整个错误(即使不使用--trace).所以"退出"是我使用的.