Как мне вернуть раннюю задачу?
У меня есть функция 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