检测到问题后如何停止 Gradle 构建?我可以使用断言、抛出异常、执行 System.exit(坏主意)或在 Gradle 中使用专用函数(但我找不到)。Gradle 的最佳方式是什么(为什么?)。
6 回答
org.gradle.api
我通常会从包中抛出相关的异常,例如InvalidUserDataException
当有人输入无效的内容时,或者GradleScriptException
更一般的错误。
如果你想停止当前的任务或动作,然后继续下一个,你也可以抛出一个StopActionException
如果要停止构建,请抛出:
throw new GradleException('error occurred')
或抛出上述异常的子类。一些子类异常实际上只会使当前任务失败,但会继续构建。
目前没有专门的方法,尽管已经讨论过要添加一个。
停止 Gradle 构建的推荐方法是引发异常。由于 Groovy 没有检查异常,并且 Gradle 默认不打印异常类型,因此抛出哪个异常并不重要。在构建脚本中,经常使用 GradleException,但 Groovy 断言也似乎是合理的(取决于环境和受众)。重要的是提供明确的信息。添加原因(如果可用)有助于调试 ( --stacktrace
)。
Gradle 提供了专用的异常类型StopExecutionException
/StopActionException
用于停止当前任务/任务操作但继续构建。
如果您以后不想捕获异常,另一种选择是调用 ant fail 任务。在我看来,它更容易阅读,并且您可以在不使用 --stacktrace 的情况下向用户发送一个很好的消息。
task (tarball, dependsOn: warAdmin) << {
ant.fail('The sky is falling!!')
}
给你一个消息,如:
* What went wrong:
Execution failed for task ':tarball'.
> The sky is falling!!
可能你可以抓住这个(也许它会抛出 ant 的 BuildException?),但如果这是一个目标,那么我不会使用 ant.fail。我只想通过抛出 tim_yates 建议的标准 gradle 异常来轻松查看要捕获的异常。
抛出一个简单的 GradleException 可以停止构建脚本。这对于检查所需的环境设置非常有用。
GradleException('your message, why the script is stopped.')
例子:
if(null == System.getenv()['GRADLE_USER_HOME']) {
throw new GradleException('Required GRADLE_USER_HOME environment variable not set.')
}
这是一个尝试模拟 Gradle javac 任务如何引发错误的代码片段:
task myCommand(type:Exec) {
... normal task setup ....
ignoreExitValue true
standardOutput = new ByteArrayOutputStream()
ext.output = { standardOutput.toString() }
doLast {
if (execResult.exitValue) {
logger.error(output())
throw new TaskExecutionException( it,
new Exception( "Command '${commandLine.join(' ')}' failed; "
+ "see task output for details." )
)
}
}
}
当命令返回0
时,没有输出。任何其他值都将打印标准输出并停止构建。
注意:如果您的命令也写入 errorOutput,您可能需要将其包含在错误日志中。