rails create ruby rake

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