Как мне вернуть раннюю задачу?

У меня есть функция rake, где я делаю некоторые проверки в начале, если одна из проверок не работает, я хотел бы вернуться раньше из задачи rake, я не хочу выполнять какой-либо из оставшегося кода.

Я думал, что решение будет заключаться в возврате туда, где я хотел бы вернуться из кода, но я получаю следующую ошибку:

unexpected return

Ответ 1

Задача 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

Я предпочитаю второй вариант.

Ответ 2

Вы можете использовать abort(message) внутри задачи, чтобы прервать эту задачу сообщением.

Ответ 3

Я предпочитаю использовать abort, что является лучшей альтернативой в таких ситуациях, например:

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

Ответ 4

Если вам нужно выйти из нескольких уровней блоков, вы можете использовать fail.

Например

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

(См. fooobar.com/questions/35474/....)

Ответ 5

Если вы имели в виду выход из задачи рейка, не вызывая "рейк прерванный!" сообщение, которое будет напечатано, вы можете использовать либо "прервать", либо "выйти". Но "прерывание" при использовании в блоке спасения завершает задачу, а также печатает всю ошибку (даже без использования --trace). Поэтому "выход" - это то, что я использую.

Ответ 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 или нет.

Ответ 7

Я использовал next подход, предложенный Simone Carletti, так как при тестировании грабли задача abort, которая на самом деле является просто оберткой для exit, не является желаемым поведением.

Пример:

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