Comment puis-je revenir tôt d’une tâche de ratissage?

J’ai une tâche de râteau où je fais des vérifications au début. Si l’une des vérifications échoue, je voudrais revenir plus tôt de la tâche de rake, je ne veux pas exécuter le code restant.

Je pensais que la solution serait de placer un retour où je voulais retourner du code mais je reçois l’erreur suivante

unexpected return 

Une tâche Rake est essentiellement un bloc. Un bloc, à l’exception de lambdas, ne prend pas en charge le retour, mais vous pouvez passer à l’instruction next utilisant next ce qui, dans une tâche rake, a le même effet que 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 second choix.

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

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

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

Si vous avez besoin de sortir de plusieurs niveaux de bloc, vous pouvez utiliser Échec .

Par exemple

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

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

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

Retour avec une erreur

Si vous revenez avec une erreur (par exemple un code de sortie de 1), vous devez utiliser abort , 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 #{errors.count} errors! 

Retour avec succès

Si vous revenez sans erreur (par exemple, un code de sortie de 0), vous voudrez utiliser exit , qui ne prend pas de 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 une tâche cron ou quelque chose qui doit faire quelque chose après, selon que la tâche de rake a réussi ou non.