【发布时间】:2012-05-05 22:28:49
【问题描述】:
检测到问题后如何停止 Gradle 构建?我可以使用断言、抛出异常、执行 System.exit(坏主意)或在 Gradle 中使用专用函数(但我找不到)。 Gradle 的最佳方式是什么(为什么?)。
【问题讨论】:
检测到问题后如何停止 Gradle 构建?我可以使用断言、抛出异常、执行 System.exit(坏主意)或在 Gradle 中使用专用函数(但我找不到)。 Gradle 的最佳方式是什么(为什么?)。
【问题讨论】:
我通常从org.gradle.api package 抛出相关异常,例如InvalidUserDataException 表示有人输入了无效的内容,或者GradleScriptException 表示更一般的错误。
如果你想停止当前的任务或动作,继续下一个,你也可以抛出StopActionException
【讨论】:
require(something != whatever) { "No good!" },而不是更冗长和类型为 ee 的 if(something != whatever){ throw new GradleException("No good!") }
GradleScriptException 的可怕之处在于它需要第二个参数来表示原因。
make 的理念是rules(任务-s)成功或失败。我曾经尝试过return false -- Gradle 只是忽略它并继续运行。
如果你想停止构建,抛出:
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 异常来轻松查看要捕获的异常。
【讨论】:
throw new GradleException("The sky is falling!!") (Gradle 3.4.1) 的输出相同
抛出一个简单的 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,您可能需要将其包含在错误日志中。
【讨论】: