it-swarm.com.de

Wie komme ich früher von einer Rake-Aufgabe zurück?

Ich habe eine Rake-Aufgabe, bei der ich am Anfang einige Überprüfungen durchführe. Wenn eine der Prüfungen fehlschlägt, würde ich gerne von der Rake-Aufgabe vorzeitig zurückkehren.

Ich dachte, die Lösung wäre, eine Rückgabe dort zu platzieren, wo ich aus dem Code zurückkehren wollte, aber ich erhalte die folgende Fehlermeldung

unexpected return
194
Janak

Eine Rake-Aufgabe ist im Grunde ein Block. Ein Block mit Ausnahme von Lambdas unterstützt return nicht. Sie können jedoch mit next zur nächsten Anweisung springen, die in einer Rake-Task die gleiche Wirkung hat wie die Verwendung von return in einer Methode.

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

Oder Sie können den Code in einer Methode verschieben und in der Methode return verwenden.

task :foo do
  do_something
end

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

Ich bevorzuge die zweite Wahl.

247
Simone Carletti

Sie können abort(message) innerhalb der Task verwenden, um diese Task mit einer Nachricht abzubrechen.

162
Sergikon

Ich neige dazu, abort zu verwenden, was in solchen Situationen eine bessere Alternative ist, zum Beispiel:

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

Wenn Sie multiple Blockebenen durchbrechen müssen, können Sie fail verwenden.

Zum Beispiel

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

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

10
mjs

Wenn Sie eine Rake-Aufgabe verlassen wollten, ohne dass der "Rake abgebrochen!" Nachricht gedruckt werden soll, dann können Sie entweder "Abbruch" oder "Beenden" verwenden. "Abort" bricht jedoch die Aufgabe ab, wenn sie in einem Rettungsblock verwendet wird, und druckt den gesamten Fehler (auch ohne --trace). Ich benutze also "Exit".

8
ZX12R

❌ Mit einem Fehler zurückkehren

Wenn Sie with einen Fehler (d. H. Einen Exit-Code von 1) zurückgeben, sollten Sieabortverwenden, was auch einen optionalen String-Parameter erfordert, der beim Beenden ausgegeben wird: 

task :check do
  errors = get_errors

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

  # Do remaining checks...
end

In der Befehlszeile:

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

✅ Mit Erfolg zurückkehren

Wenn Sie ohne einen Fehler (d. H. Einen Exit-Code 0) zurückgeben, sollten Sieexitverwenden, wobei nicht einen String-Parameter verwendet.

task :check do
  errors = get_errors

  exit if errors.empty?

  # Process errors...
end

In der Befehlszeile:

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

Dies ist wichtig, wenn Sie dies in einem Cron-Job verwenden oder etwas, das danach etwas tun muss, je nachdem, ob die Rake-Aufgabe erfolgreich war oder nicht.

2
Joshua Pinter

Ich habe die von Simone Carletti vorgeschlagene next-Methode verwendet, da abort beim Testen der Rake-Task, die eigentlich nur ein Wrapper für exit ist, nicht das gewünschte Verhalten ist.

Beispiel:

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