2014-02-15 7 views
6

Ich schrieb eine SBT Aufgabe, um cssLint für mein Projekt mit Rhino laufen zu lassen. cssLint gibt den Exit-Code an meine SBT-Task zurück.Wie kann SBT Task fehlschlagen und sich selbst aufbauen?

Meine Frage ist, wie die Aufgabe fehlschlägt, wenn der Exit-Code nicht Null ist?

Ich möchte keine Ausnahmen werfen. Ich möchte, dass meine letzte Zeile des Task-Ergebnisses [Failed] anstelle von [success] anzeigt und der Code meiner SBT-Aufgabe ungleich Null ist.

SAMPLE

MyTask { 
    val exitcode = //rhino functions 

    //what to do?? 
} 

Die eigentliche Absicht ist es, die Build fehl, wenn CSS-Fehler vorhanden sind.

Antwort

4

Mein Verständnis ist, dass die Erfolgsmeldung, es sei denn

immer ausgedruckt wird
  • showSuccess Einstellung false oder
  • eine Aufgabe löst eine Ausnahme festgelegt ist.

In Ihrem speziellen Fall, dass Sie einen Fehler melden und so sollten Sie eine Ausnahme oder einen Wert des Typs des Ergebnisses werfen, die eine Art Ausnahme wie None oder Failure betrachtet werden könnten.

Sag mal, haben Sie die folgende Aufgabe in build.sbt definiert bekommen:

lazy val tsk = taskKey[Unit]("Task that always fails") 

tsk := { 
    throw new IllegalStateException("a message") 
} 

Wenn Sie die tsk Aufgabe ausführen, wird die Ausnahme danach ohne [success] ausgedruckt.

[no-success]> tsk 
[trace] Stack trace suppressed: run last *:tsk for the full output. 
[error] (*:tsk) java.lang.IllegalStateException: a message 
[error] Total time: 0 s, completed Feb 15, 2014 11:45:27 PM 

Ich würde eher bevorzugen diese Art der Programmierung zu vermeiden und setzen auf Option als eine Möglichkeit, ein Problem mit der Verarbeitung zu melden.

Mit folgendem tskO Definition:

lazy val tskO = taskKey[Option[String]]("Task that reports failure as None") 

tskO := None 

Sie würde dann das Ergebnis überprüfen und, wenn es None ist Sie würden wissen, dass es ein Fehler ist.

+0

Returning None schlägt den Build nicht fehl. Exception-Stack-Trace wird nur unterdrückt, wenn der Task von der sbt-Shell ausgeführt wird. –

0

Die Art und Weise den Bau von Unterlassen ohne die Stacktrace auf der Konsole Herstellung der Ausnahmen verwendet, die speziell behandelt werden:

  • für sbt.MessageOnlyException eine Fehlermeldung zweimal protokolliert wird (ohne Task-Namen und dann mit Task-Namen) und der Build wird gestoppt
  • mixen Sie in sbt.FeedbackProvidedException oder sbt.UnprintableException, um benutzerdefinierte Ausnahmen zu implementieren, für die sbt kein Stacktrace druckt. Die Zeichenfolge mit dem Namen und der Ausnahme der Aufgabe toString wird einmal auf der obersten Ebene protokolliert, und der Build wird beendet. Es wird erwartet, dass wesentliche Informationen für den Benutzer bereits protokolliert werden, bevor diese geworfen werden.

Haftungsausschluss: Ich habe diese Informationen nicht in sbt Handbuch gesehen. Aus den Quellen von sbt 0.13.16 extrahiert.sbt.FeedbackProvidedException wird auf diese Weise von sbt Compiler, sbt Tests und von sbt-web und Play sbt Plugins verwendet.

Verwandte Themen