我写了一个SBT任务,使用rhino为我的项目运行cssLint.cssLint将退出代码返回给我的SBT任务.
我的问题是如果退出代码非零,如何使任务失败?
我不想抛出任何例外.我希望我的任务结果的最后一行显示[Failed]而不是[success]退出我的SBT任务的代码并且非零.
样品
MyTask {
val exitcode = //rhino functions
//what to do??
}
Run Code Online (Sandbox Code Playgroud)
如果存在css错误,实际意图是使构建失败.
使构建失败而不在控制台上生成堆栈跟踪的方法是使用专门处理的异常:
sbt.MessageOnlyException消息被记录两次(没有任务名称,然后有任务名称)并且构建停止sbt.FeedbackProvidedException或sbt.UnprintableException来实现 sbt 不打印堆栈跟踪的自定义异常。包含任务名称和异常的字符串toString将在顶层记录一次,然后构建停止。预计在抛出这些信息之前已经记录了用户的基本信息。免责声明:我没有在 sbt 手册中看到此信息。摘自 sbt 0.13.16 的来源。sbt.FeedbackProvidedExceptionsbt 编译器、sbt 测试以及 sbt-web 和 Play sbt 插件都以这种方式使用。
我的理解是,除非成功,否则总是会打印出成功消息
showSuccess设置设置为false或在您的特定情况下,您想要报告错误,因此您应该抛出异常或结果类型的值,这些值可能被视为一种异常,如None或Failure。
假设您在 中定义了以下任务build.sbt:
lazy val tsk = taskKey[Unit]("Task that always fails")
tsk := {
throw new IllegalStateException("a message")
}
Run Code Online (Sandbox Code Playgroud)
当你执行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
Run Code Online (Sandbox Code Playgroud)
我宁愿避免这种编程风格,而是依靠Option作为报告处理问题的一种方式。
具有以下tskO定义:
lazy val tskO = taskKey[Option[String]]("Task that reports failure as None")
tskO := None
Run Code Online (Sandbox Code Playgroud)
然后你会检查结果,如果是,None你就会知道这是一个失败。