停止Gradle构建的推荐方法


162

发现问题后如何停止Gradle构建?我可以使用断言,引发异常,执行System.exit(坏主意)或在Gradle中使用专用功能(但我找不到一个)。Gradle的最佳方法是什么(为什么?)。

Answers:


117

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

如果要停止当前任务或操作,然后继续执行下一个任务,则还可以抛出一个 StopActionException


5
如果任务未成功执行,您还可以使用TaskExecutionException。(根据gradle 1.11文档,情况确实如此,我不确定何时引入。)
Josh Gagnon 2014年

这里有什么不错的语法选项吗?考虑一下kotlin的前置条件语法:require(something != whatever) { "No good!" }与更冗长且更容易输入的ee相对if(something != whatever){ throw new GradleException("No good!") }
Groostav '16

可怕的GradleScriptException是,它需要第二个参数作为原因。
Trejkaz

...当然,我们要避免说这是“ 异常编程 ”?!我已经用这种方式编写了遗留代码,并且维护它是一种恐怖。在过去,哲学makerules(任务)成功或失败。我曾经尝试过return false-Gradle只是忽略了它并继续运行。

87

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

throw new GradleException('error occurred')

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


28

尽管没有讨论添加一种方法,但是目前还没有专用的方法。

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

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


19

如果您以后不希望捕获异常,则另一个选择是调用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异常来轻松地发现要捕获的异常。


如何设置?称它为?
powder366 2013年

1
只需致电ant.fail('您选择的消息')即可,无需进行设置
Gus

2
看起来此输出使用throw new GradleException("The sky is falling!!")(Gradle 3.4.1)
mgaert

@mgaert我似乎回想起4年前写这篇文章时,打印的消息确实有所不同(但这已经很长时间了,我不想弄清楚当时的最新版本并进行检查)。除此之外,恕我直言,ant.fail更清楚地传达了完全停止构建的意图,而引发的异常读取为可能被捕获和处理的东西。
Gus

12

抛出一个简单的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.')
}

5

这是一个代码片段,试图模拟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,没有输出。任何其他值将打印standardOutput并停止构建。

注意:如果您的命令也写入了errorOutput,则可能需要将其包括在错误日志中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.