推荐的方法来停止一个 Gradle 构建

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

88339 次浏览

我通常抛出来自 org.gradle.api包裹的相关异常,例如,当某人输入了无效的内容时,抛出 InvalidUserDataException,或者抛出更一般的错误时,抛出 GradleScriptException

如果希望停止当前任务或操作,并继续执行下一个任务,也可以抛出 StopActionException

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

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

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

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

throw new GradleException('error occurred')

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

如果您不希望稍后能够捕获异常,另一种选择是调用 ant false 任务。在我看来,这样做更容易理解,而且不需要使用—— 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。我只需要像 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,则可能需要将其包含在错误日志中。