¿Cómo regreso temprano de una tarea de rake?
Tengo una tarea de rake donde hago algunas comprobaciones al principio, si una de las comprobaciones falla me gustaría regresar temprano de la tarea de rake, no quiero ejecutar ninguno de los códigos restantes.
Pensé que la solución sería colocar un retorno donde quería regresar del código, pero obtengo el siguiente error
unexpected return
7 answers
Una tarea de Rake es básicamente un bloque. Un bloque, excepto lambdas, no soporta return pero puedes saltar a la siguiente instrucción usando next
que en una tarea rake tiene el mismo efecto de usar return en un método.
task :foo do
puts "printed"
next
puts "never printed"
end
O puede mover el código en un método y usar return en el método.
task :foo do
do_something
end
def do_something
puts "startd"
return
puts "end"
end
Prefiero la segunda opción.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-19 07:25:43
Puede usar abort(message)
desde dentro de la tarea para abortar esa tarea con un mensaje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-23 15:52:32
Tiendo a usar abort
que es una mejor alternativa en tales situaciones, por ejemplo:
task :foo do
something = false
abort 'Failed to proceed' unless something
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-01 04:13:14
Si necesita salir de múltiples niveles de bloque, puede usar fail.
Por ejemplo
task :something do
[1,2,3].each do |i|
...
fail "some error" if ...
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:41
Si se refería a salir de una tarea de rake sin causar el " rake aborted!"mensaje que se imprimirá, luego puede usar "abortar"o " salir". Pero "abort", cuando se utiliza en un bloque de rescate, termina la tarea, así como imprime todo el error (incluso sin usar trace trace). Así que "salir" es lo que uso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-25 12:52:32
Devuelve con un error
Si devuelve con un error (es decir, un código de salida de 1), querrá usar abort
, que también toma un parámetro de cadena opcional que se generará al salir:
task :check do
errors = get_errors
abort( "There are #{errors.count} errors!" ) if errors.any?
# Do remaining checks...
end
En la línea de comandos:
$ rake check && echo "All good"
There are 2 errors!
Volver con éxito
Si devuelve sin un error (es decir, un código de salida de 0), querrá usar exit
, que no toma una cadena param.
task :check do
errors = get_errors
exit if errors.empty?
# Process errors...
end
En la línea de comandos:
$ rake check && echo "All good"
All good
Esto es importante si está usando esto en un trabajo cron o algo que necesita hacer algo después en función de si la tarea de rake tuvo éxito o no.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-19 22:19:22
Usé next
el enfoque sugerido por Simone Carletti, ya que al probar la tarea rake, abort
, que de hecho es solo un envoltorio para exit
, no es el comportamiento deseado.
Ejemplo:
task auto_invoice: :environment do
if Application.feature_disabled?(:auto_invoice)
$stderr.puts 'Feature is disabled, aborting.'
next
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-07 14:32:45