如何从rake任务中提前返回?

时间:2010-02-23 07:46:47

标签: ruby rake

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

我认为解决方案是在我希望从代码返回的地方放置一个返回但是我收到以下错误

unexpected return

7 个答案:

答案 0 :(得分:255)

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

我更喜欢第二种选择。

答案 1 :(得分:166)

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

答案 2 :(得分:18)

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

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

答案 3 :(得分:10)

如果您需要突破多个块级别,可以使用fail

例如

task :something do
  [1,2,3].each do |i|
    ...
    fail "some error" if ...
  end
end

(见https://stackoverflow.com/a/3753955/11543。)

答案 4 :(得分:8)

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

答案 5 :(得分:6)

返回错误❌

如果您使用错误(即退出代码为1)返回,则需要使用 abort ,这也是可选的将在退出时输出的字符串参数:

task :check do
  errors = get_errors

  abort( "There are #{errors.count} errors!" ) if errors.any?

  # Do remaining checks...
end

在命令行上:

$ rake check && echo "All good"
#=> There are 2 errors!

成功回归✅

如果您在没有错误的情况下返回(即退出代码为0),则需要使用 exit ,其中采取字符串参数。

task :check do
  errors = get_errors

  exit if errors.empty?

  # Process errors...
end

在命令行上:

$ rake check && echo "All good"
#=> All good

如果你在cron工作中使用它,或者之后根据rake任务是否成功需要做某事,这很重要。

答案 6 :(得分:0)

我使用了西蒙娜·卡列蒂(Simone Carletti)建议的next方法,因为在测试瑞克任务时,实际上只是abort的包装器的exit并不是期望的行为。

示例:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end