¿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
 192
Author: Simone Carletti, 2010-02-23

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.

 236
Author: Simone Carletti,
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.

 157
Author: Sergikon,
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
 15
Author: khelll,
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

(Véase https://stackoverflow.com/a/3753955/11543.)

 10
Author: mjs,
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.

 8
Author: ZX12R,
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.

 1
Author: Joshua Pinter,
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
 0
Author: Artur Beljajev,
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