建议停止Gradle构建的方法

Kar*_*och 152 groovy build gradle

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

tim*_*tes 112

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

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

  • 如果任务未成功执行,您还可以使用[TaskExecutionException](http://www.gradle.org/docs/current/javadoc/org/gradle/api/tasks/TaskExecutionException.html).(根据gradle 1.11文档,这是真的,我不确定它什么时候被引入.) (4认同)
  • 这里有什么不错的语法选项吗?考虑 kotlin 的先决条件语法:`require(something !=whatever) { "No good!" }` 而不是更冗长的类型-ee `if(something !=whatever){ throw new GradleException("No good!") }` (2认同)

ski*_*ipy 78

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

throw new GradleException('error occurred')
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*ser 25

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

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

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


Gus*_*Gus 16

如果您以后不希望能够捕获异常,则另一个选择是调用ant fail任务.在我看来,它更容易阅读,您可以在不使用--stacktrace的情况下向用户发送一条好消息.

task (tarball, dependsOn: warAdmin) << {
    ant.fail('The sky is falling!!')
}
Run Code Online (Sandbox Code Playgroud)

给你一条消息:

* What went wrong:
Execution failed for task ':tarball'.
> The sky is falling!!
Run Code Online (Sandbox Code Playgroud)

可能你可以捕获这个(也许它会抛出ant的BuildException?)但如果这是一个目标,那么我就不会使用ant.fail.我只是通过抛出标准的gradle异常(如tim_yates建议)来轻松查看要捕获的异常.

  • 看起来这与使用`throw new GradleException(“天空正在下降!!”))**相同**(第3.4.1级) (2认同)

小智 11

抛出一个简单的GradleException就可以停止构建脚本.这非常适合检查所需的环境设置.

GradleException('your message, why the script is stopped.')
Run Code Online (Sandbox Code Playgroud)

例:

if(null == System.getenv()['GRADLE_USER_HOME']) {
    throw new GradleException('Required GRADLE_USER_HOME environment variable not set.')
}
Run Code Online (Sandbox Code Playgroud)


cmc*_*nty 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." )
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当命令返回时0,没有输出。任何其他值都将打印标准输出并停止构建。

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