2014-02-15 2 views
6

Я написал задачу SBT для запуска cssLint для моего проекта с использованием носорога. cssLint возвращает код выхода в мою задачу SBT.Как сделать задачу SBT неудачной и, следовательно, построить себя?

Мой вопрос заключается в том, как сделать задачу неудачной, если код выхода не равен нулю?

Я не хочу исключать какие-либо исключения. Я хочу, чтобы моя последняя строка результата задачи отображала [Failed] вместо [success] и код завершения моей задачи SBT был отличным от нуля.

ОБРАЗЦА

MyTask { 
    val exitcode = //rhino functions 

    //what to do?? 
} 

Действительное намерение состоит в том, чтобы провалить сборки, если ошибки CSS присутствуют.

ответ

4

Мое понимание является то, что сообщение об успешном распечатывается всегда, если только

  • showSuccess установка устанавливается в false или
  • задача генерирует исключение.

В вашем конкретном случае, если вы хотите сообщить об ошибке, и поэтому вы должны выбросить исключение или значение типа результата, который можно было бы считать своего рода исключением, как None или Failure.

Скажем, у вас есть следующие задачи, определенные в build.sbt:

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

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

При выполнении tsk задачи, исключение распечатываться без [success] впоследствии.

[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 

я предпочел бы избежать такой стиль программирования и полагаться на Option как способ сообщить о проблеме, с обработкой.

Со следующим tskO определения:

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

tskO := None 

вы затем проверить результат, и если это None вы знаете, что это провал.

+0

Возврат Ни один не проваливает сборку. Трассировка стека исключений только подавляется, когда задача запускается из оболочки sbt. –

0

Способ провалив сборки без получения StackTrace на консоли с помощью исключений, которые специально обработаны:

  • для sbt.MessageOnlyException сообщение об ошибке записывается в два раза (без названия задачи, а затем с именем задачи) и сборка остановлена ​​
  • mix в sbt.FeedbackProvidedException или sbt.UnprintableException для реализации пользовательских исключений, для которых sbt не печатает stacktrace. Строка с именем задачи и значением toString исключения регистрируется на верхнем уровне один раз, и сборка остановлена. Ожидается, что необходимая информация для пользователя уже зарегистрирована, прежде чем бросать их.

Отказ от ответственности: Я не видел эту информацию в руководстве sbt. Извлечены из источников sbt 0.13.16.sbt.FeedbackProvidedException используется таким образом с помощью sbt-компилятора, sbt-тестов и sbt-web и Play sbt-плагинов.

Смежные вопросы