¿Cómo regreso temprano de una tarea de rake?

Resuelto Janak asked hace 14 años • 7 respuestas

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
Janak avatar Feb 23 '10 14:02 Janak
Aceptado

Una tarea de Rake es básicamente un bloque. Un bloque, excepto lambdas, no admite retorno, pero puede pasar a la siguiente declaración, nextque 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.

Simone Carletti avatar Feb 23 '2010 07:02 Simone Carletti

Puede utilizar abort(message)desde dentro de la tarea para cancelar esa tarea con un mensaje.

Sergikon avatar Dec 23 '2010 15:12 Sergikon

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 rescuebloque sin seguimiento de pila.

De forma predeterminada, si lo usa abortdentro de un rescuebloque, generará el seguimiento completo de la pila, incluso si solo lo usa abortsin volver a generar el error.

Para solucionar esto, puede proporcionar un código de salida distinto de cero al exitcomando, como:


task :check do

  begin
    do_the_thing_that_raises_an_exception
  rescue => error
    puts error.message
 
    exit( 1 )
  end

end
Joshua Pinter avatar May 09 '2018 18:05 Joshua Pinter

Tiendo a utilizar abortcuál es una mejor alternativa en tales situaciones, por ejemplo:

task :foo do
  something = false
  abort 'Failed to proceed' unless something
end
khelll avatar Nov 01 '2015 04:11 khelll