2010-02-23 26 views
179

我有一个rake任务,我在开始时进行一些检查,如果其中一个检查失败,我想从rake任务提前返回,我不想执行任何剩余的代码。如何从耙子任务提前返回?

我认为解决办法是把一回,我想从代码返回,但我得到以下错误

unexpected return 

回答

223

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 

我更喜欢第二选择。

+14

我喜欢的第二个最好的。我使用rake的次数越多,我越喜欢在任务定义之外保留非平凡的代码。不是一个100%的公司规则,但似乎是一个很好的工作准则。 – 2010-02-23 09:02:35

+0

我绝对同意。而且,方法测试起来要容易得多。 – 2010-02-23 10:43:04

+1

第二种解决方案更好。在你的第一个解决方案中,我宁愿使用break而不是next来摆脱障碍......应该工作,不应该吗? – severin 2010-02-23 13:34:34

145

您可以使用任务中的abort(message)来通过消息中止该任务。

+0

因此,放弃是一种特定于耙的方式来尽早退出任务?这是有用的知道... – 2012-02-15 22:15:24

+5

@TylerRick不,它是[内核#中止](http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-abort)。 – 2012-06-11 02:42:39

+4

这种方式在非成功情况下退出会更好,因为它会自动设置退出状态。 – samuil 2014-05-28 08:44:51

7

如果您的意思是退出rake任务而不导致“rake中止!”消息要打印,那么你可以使用“中止”或“退出”。但是,当在救援块中使用“中止”时,会终止该任务并打印整个错误(即使不使用--trace)。所以“退出”是我使用的。

+1

通常,我认为使用“exit”而不是return/break是一个坏主意,因为它不会跳出* current * proc/method /等。 - 它退出整个过程并跳过调用方法可能打算后来运行的任何代码(包括可能的一些清理)。但对于耙子任务,我猜这可能不是问题... – 2012-02-15 22:18:12

9

我倾向于使用abort这是在这样的情况下更好的选择,例如:

task :foo do 
    something = false 
    abort 'Failed to proceed' unless something 
end 
+0

很好的答案!就是我在找什么.. – levelone 2016-06-09 15:30:10