我有一个rake任务,我在开始时进行一些检查,如果其中一个检查失败,我想从rake任务提前返回,我不想执行任何剩余的代码。如何从耙子任务提前返回?
我认为解决办法是把一回,我想从代码返回,但我得到以下错误
unexpected return
我有一个rake任务,我在开始时进行一些检查,如果其中一个检查失败,我想从rake任务提前返回,我不想执行任何剩余的代码。如何从耙子任务提前返回?
我认为解决办法是把一回,我想从代码返回,但我得到以下错误
unexpected return
rake任务基本上是一个块。除了lambdas以外的块不支持返回,但可以跳到使用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
我更喜欢第二选择。
您可以使用任务中的abort(message)
来通过消息中止该任务。
因此,放弃是一种特定于耙的方式来尽早退出任务?这是有用的知道... – 2012-02-15 22:15:24
@TylerRick不,它是[内核#中止](http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-abort)。 – 2012-06-11 02:42:39
这种方式在非成功情况下退出会更好,因为它会自动设置退出状态。 – samuil 2014-05-28 08:44:51
如果您的意思是退出rake任务而不导致“rake中止!”消息要打印,那么你可以使用“中止”或“退出”。但是,当在救援块中使用“中止”时,会终止该任务并打印整个错误(即使不使用--trace)。所以“退出”是我使用的。
通常,我认为使用“exit”而不是return/break是一个坏主意,因为它不会跳出* current * proc/method /等。 - 它退出整个过程并跳过调用方法可能打算后来运行的任何代码(包括可能的一些清理)。但对于耙子任务,我猜这可能不是问题... – 2012-02-15 22:18:12
如果您需要突破多个块级别,您可以使用fail。
例如
task :something do
[1,2,3].each do |i|
...
fail "some error" if ...
end
end
我倾向于使用abort
这是在这样的情况下更好的选择,例如:
task :foo do
something = false
abort 'Failed to proceed' unless something
end
很好的答案!就是我在找什么.. – levelone 2016-06-09 15:30:10
我喜欢的第二个最好的。我使用rake的次数越多,我越喜欢在任务定义之外保留非平凡的代码。不是一个100%的公司规则,但似乎是一个很好的工作准则。 – 2010-02-23 09:02:35
我绝对同意。而且,方法测试起来要容易得多。 – 2010-02-23 10:43:04
第二种解决方案更好。在你的第一个解决方案中,我宁愿使用break而不是next来摆脱障碍......应该工作,不应该吗? – severin 2010-02-23 13:34:34