ruby - create - ¿Cómo vuelvo antes de una tarea de rake?
create rake task ruby (7)
Regresar con un error
Si regresa 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 emitirá 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 comando:
$ rake check && echo "All good"
#=> There are 2 errors!
Vuelve con exito
Si va a regresar sin un error (es decir, un código de salida de 0), querrá usar exit
, que no tiene un parámetro de cadena.
task :check do
errors = get_errors
exit if errors.empty?
# Process errors...
end
En la línea de comando:
$ rake check && echo "All good"
#=> All good
Esto es importante si está utilizando esto en un trabajo cron o algo que necesita hacer algo después en función de si la tarea de comisión fue exitosa o no.
Tengo una tarea de rake donde realizo algunas verificaciones al principio, si una de las verificaciones falla, me gustaría regresar antes de la tarea de rake, no quiero ejecutar ninguno del código restante.
Pensé que la solución sería colocar una devolución donde quisiera regresar del código, pero obtengo el siguiente error
unexpected return
Puede usar abort(message)
desde dentro de la tarea para abortar esa tarea con un mensaje.
Si necesita salir de varios niveles de bloque, puede usar el fail .
Por ejemplo
task :something do
[1,2,3].each do |i|
...
fail "some error" if ...
end
end
(Consulte https://.com/a/3753955/11543 ).
Si te referías a salir de una tarea de rake sin causar el "rake abortado!" mensaje que se imprimirá, entonces puede usar "abortar" o "salir". Pero "abortar", cuando se usa en un bloque de rescate, termina la tarea e imprime todo el error (incluso sin usar --trace). Así que "salir" es lo que yo uso.
Tiendo a abort
que es una mejor alternativa en tales situaciones, por ejemplo:
task :foo do
something = false
abort ''Failed to proceed'' unless something
end
Una tarea de Rake es básicamente un bloque. Un bloque, excepto las lambdas, no admite el retorno, pero puede saltar a la siguiente declaración usando el next
que en una tarea de rake tiene el mismo efecto que usar el 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.
Utilicé el next
enfoque sugerido por Simone Carletti, ya que al probar la tarea de rake, el abort
, que en realidad es solo un envoltorio para la 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