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
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.
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!
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.