183

检测到问题后如何停止 Gradle 构建?我可以使用断言、抛出异常、执行 System.exit(坏主意)或在 Gradle 中使用专用函数(但我找不到)。Gradle 的最佳方式是什么(为什么?)。

4

6 回答 6

138

org.gradle.api我通常会从包中抛出相关的异常,例如InvalidUserDataException当有人输入无效的内容时,或者GradleScriptException更一般的错误。

如果你想停止当前的任务或动作,然后继续下一个,你也可以抛出一个StopActionException

于 2012-04-25T09:09:36.457 回答
110

如果要停止构建,请抛出:

throw new GradleException('error occurred')

或抛出上述异常的子类。一些子类异常实际上只会使当前任务失败,但会继续构建。

于 2012-05-12T02:35:51.153 回答
29

目前没有专门的方法,尽管已经讨论过要添加一个。

停止 Gradle 构建的推荐方法是引发异常。由于 Groovy 没有检查异常,并且 Gradle 默认不打印异常类型,因此抛出哪个异常并不重要。在构建脚本中,经常使用 GradleException,但 Groovy 断言也似乎是合理的(取决于环境和受众)。重要的是提供明确的信息。添加原因(如果可用)有助于调试 ( --stacktrace)。

Gradle 提供了专用的异常类型StopExecutionException/StopActionException用于停止当前任务/任务操作但继续构建。

于 2012-04-25T09:32:20.167 回答
20

如果您以后不想捕获异常,另一种选择是调用 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 异常来轻松查看要捕获的异常。

于 2013-06-13T16:13:10.067 回答
18

抛出一个简单的 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.')
}
于 2014-10-03T19:51:20.397 回答
7

这是一个尝试模拟 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,您可能需要将其包含在错误日志中。

于 2016-07-01T00:51:34.157 回答