web-dev-qa-db-fra.com

Comment puis-je revenir tôt d'une tâche de rake?

J'ai une tâche rake dans laquelle je fais quelques vérifications au début. Si l'une des vérifications échoue, j'aimerais revenir plus tôt de la tâche rake. Je ne souhaite exécuter aucun des codes restants.

Je pensais que la solution serait de placer un retour où je voulais retourner du code mais j'obtiens l'erreur suivante

unexpected return
194
Janak

Une tâche de rake est fondamentalement un bloc. Un bloc, à l'exception de lambdas, ne prend pas en charge le retour, mais vous pouvez passer à l'instruction suivante à l'aide de next qui, dans une tâche rake, a le même effet que d'utiliser return dans une méthode.

task :foo do
  puts "printed"
  next
  puts "never printed"
end

Ou vous pouvez déplacer le code dans une méthode et utiliser return dans la méthode.

task :foo do
  do_something
end

def do_something
  puts "startd"
  return
  puts "end"
end

Je préfère le deuxième choix.

247
Simone Carletti

Vous pouvez utiliser abort(message) depuis l’intérieur de la tâche pour l’abandonner avec un message.

162
Sergikon

J'ai tendance à utiliser abort qui est une meilleure alternative dans de telles situations, par exemple:

task :foo do
  something = false
  abort 'Failed to proceed' unless something
end
18
khelll

Si vous devez sortir de plusieurs niveaux de bloc, vous pouvez utiliser fail .

Par exemple

task :something do
  [1,2,3].each do |i|
    ...
    fail "some error" if ...
  end
end

(Voir https://stackoverflow.com/a/3753955/11543 .)

10
mjs

Si vous vouliez dire quitter une tâche de rake sans provoquer le "rake avorté!" message à imprimer, vous pouvez alors utiliser "abort" ou "exit". Mais "abort", lorsqu'il est utilisé dans un bloc de secours, termine la tâche et affiche toute l'erreur (même sans utiliser --trace). Donc, "sortie" est ce que j'utilise.

8
ZX12R

❌ Retour avec une erreur

Si vous renvoyez avec une erreur (par exemple, un code de sortie égal à 1), vous voudrez utiliserabort, qui prend également un paramètre de chaîne facultatif qui sera généré à la sortie: 

task :check do
  errors = get_errors

  abort( "There are #{errors.count} errors!" ) if errors.any?

  # Do remaining checks...
end

Sur la ligne de commande:

$ rake check && echo "All good"
#=> There are 2 errors!

✅ Retour avec succès

Si vous renvoyez sans une erreur (par exemple, un code de sortie de 0), vous voudrez utiliserexit, ce que ne prend pas pour prendre un paramètre de chaîne.

task :check do
  errors = get_errors

  exit if errors.empty?

  # Process errors...
end

Sur la ligne de commande:

$ rake check && echo "All good"
#=> All good

Ceci est important si vous utilisez ceci dans un travail cron ou si quelque chose doit être fait ultérieurement, en fonction de la réussite ou non de la tâche de ratissage.

2
Joshua Pinter

J'ai utilisé l'approche next proposée par Simone Carletti, car lors du test de la tâche de commission, abort, qui n'est en fait qu'un wrapper pour exit, n'est pas le comportement souhaité.

Exemple:

task auto_invoice: :environment do
  if Application.feature_disabled?(:auto_invoice)
    $stderr.puts 'Feature is disabled, aborting.'
  next
end
0
Artur Beljajev