2010-09-20 1 views
41

Lassen Sie uns sagen, ich habe eine Rakefile wie folgt aus:Wie scheitert eine Aufgabe in Ruby Rake explizit?

file 'file1' => some_dependencies do 
    sh 'external tool I do not have control over, which sometimes fail to create the file' 
    ??? 
end 

task :default => 'file1' do 
    puts "everything's OK" 
end 

Nun, wenn ich nichts anstelle von ??? setzen, erhalte ich die Meldung OK, auch wenn das externe Tool-Datei zu erzeugen, schlägt fehl. Was ist der richtige Weg, um Rake zu informieren, dass "Datei1" Task fehlgeschlagen ist und es sollte abbrechen (hoffentlich eine sinnvolle Nachricht zu präsentieren - wie die Aufgabe gescheitert ist) - der einzige Gedanke, den ich jetzt denken kann, ist eine Ausnahme dort, aber das scheint einfach nicht richtig.

P.S Das Werkzeug gibt immer 0 als Exitcode zurück.

Antwort

54

Verwenden Sie die raise oder fail Methode, wie Sie es für andere Ruby-Skript (fail ist ein Alias ​​für raise). Diese Methode verwendet eine Zeichenfolge oder eine Ausnahme als Argument, das als die bei der Beendigung des Skripts angezeigte Fehlermeldung verwendet wird. Dies führt auch dazu, dass das Skript den Wert 1 an die aufrufende Shell zurückgibt. Es ist dokumentiert here und anderen Orten.

+4

['fail'] (http://ruby-doc.org/core-2.0/Kernel.html#method-i-fail) ist nur ein Alias ​​für [' raise'] (http: // ruby- doc.org/core-2.0/Kernel.html#method-i-raise) – Stefan

+0

Richtig du bist. Meine Antwort wurde aktualisiert, um dies anzuzeigen. –

+0

Link ist unterbrochen. –

11

Sie können abort("message") verwenden, um Rake-Task fehlerfrei zu beenden.

Es wird mit Code message auf stdout und Ausfahrt drucken 1.

Exit-Code 1 ist ein Fehler in Unix-artigen Systemen.

Weitere Informationen finden Sie unter Kernel#abort.