¿Cómo regreso temprano de una tarea de rake?
Tengo una tarea de rake en la que hago algunas comprobaciones al principio. Si una de las comprobaciones falla, me gustaría regresar antes de la tarea de rake, no quiero ejecutar el código restante.
Pensé que la solución sería colocar un retorno donde quería regresar del código pero me sale el siguiente error
unexpected return
Una tarea de Rake es básicamente un bloque. Un bloque, excepto lambdas, no admite retorno, pero puede pasar a la siguiente declaración, next
que en una tarea rake tiene el mismo efecto que usar retorno 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.
Puede utilizar abort(message)
desde dentro de la tarea para cancelar esa tarea con un mensaje.
Volver con un error ❌
Si regresa con un error (es decir, un código de salida de 1
), querrá usar abort
, que también requiere un parámetro de cadena opcional que se generará al salir:
task :check do
# If any of your checks fail, you can exit early like this.
abort( "One of the checks has failed!" ) if check_failed?
end
En la línea de comando:
$ rake check && echo "All good"
#=> One of the checks has failed!
Regresa con Éxito ✅
Si regresa sin un error (es decir, un código de salida de 0
), querrá usar exit
, que no requiere un parámetro de cadena.
task :check do
# If any of your checks fail, you can exit early like this.
exit if check_failed?
end
En la línea de comando:
$ 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 fue exitosa o no.
Bonificación: regreso con un error de un rescue
bloque sin seguimiento de pila.
De forma predeterminada, si lo usa abort
dentro de un rescue
bloque, generará el seguimiento completo de la pila, incluso si solo lo usa abort
sin volver a generar el error.
Para solucionar esto, puede proporcionar un código de salida distinto de cero al exit
comando, como:
task :check do
begin
do_the_thing_that_raises_an_exception
rescue => error
puts error.message
exit( 1 )
end
end
Tiendo a utilizar abort
cuál es una mejor alternativa en tales situaciones, por ejemplo:
task :foo do
something = false
abort 'Failed to proceed' unless something
end