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
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.
Vous pouvez utiliser abort(message)
depuis l’intérieur de la tâche pour l’abandonner avec un message.
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
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
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.
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!
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.
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