停止 Gradle 构建的推荐方法
Posted
技术标签:
【中文标题】停止 Gradle 构建的推荐方法【英文标题】:Recommended way to stop a Gradle build 【发布时间】:2012-05-05 22:28:49 【问题描述】:检测到问题后如何停止 Gradle 构建?我可以使用断言、抛出异常、执行 System.exit(坏主意)或在 Gradle 中使用专用函数(但我找不到)。 Gradle 的最佳方式是什么(为什么?)。
【问题讨论】:
【参考方案1】:我通常从org.gradle.api
package 抛出相关异常,例如InvalidUserDataException
表示有人输入了无效的内容,或者GradleScriptException
表示更一般的错误。
如果你想停止当前的任务或动作,继续下一个,你也可以抛出StopActionException
【讨论】:
如果任务执行不成功,也可以使用TaskExecutionException。 (根据 gradle 1.11 文档,这是真的,我不确定它是什么时候引入的。) 这里有什么不错的语法选项吗?考虑 kotlin 的前置条件语法:require(something != whatever) "No good!"
,而不是更冗长和类型为 ee 的 if(something != whatever) throw new GradleException("No good!")
GradleScriptException
的可怕之处在于它需要第二个参数来表示原因。
... 当然我们避免说这是“异常编程”?!我有以这种方式编写的遗留代码,维护起来很可怕......在旧时代围绕make
的理念是rules
(任务-s)成功或失败。我曾经尝试过return false
-- Gradle 只是忽略它并继续运行。【参考方案2】:
如果你想停止构建,抛出:
throw new GradleException('error occurred')
或抛出上述异常的子类。一些子类异常实际上只会使当前任务失败,但会继续构建。
【讨论】:
【参考方案3】:目前没有专门的方法,尽管已经讨论过要添加一个。
停止 Gradle 构建的推荐方法是引发异常。由于 Groovy 没有检查异常,并且 Gradle 默认不打印异常类型,因此抛出哪个异常并不重要。在构建脚本中,经常使用 GradleException,但 Groovy 断言也似乎是合理的(取决于环境和受众)。重要的是提供明确的信息。添加原因(如果可用)有助于调试 (--stacktrace
)。
Gradle 提供专用的异常类型 StopExecutionException
/StopActionException
用于停止当前任务/任务操作但继续构建。
【讨论】:
【参考方案4】:如果您以后不想捕获异常,另一种选择是调用 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 异常来轻松查看要捕获的异常。
【讨论】:
如何设置?叫它? 只需调用 ant.fail('message of your choice') 无需设置 它的输出看起来与使用throw new GradleException("The sky is falling!!")
(Gradle 3.4.1) 的输出相同
@mgaert 我似乎记得 4 年前我写这篇文章时,打印的信息确实不同(但那是很长一段时间,我不想弄清楚当时的版本是什么和检查)。除此之外,恕我直言 ant.fail 更清楚地传达了完全停止构建的意图,而抛出的异常读取为可能被捕获和处理的东西。【参考方案5】:
抛出一个简单的 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.')
【讨论】:
【参考方案6】:这是一个尝试模拟 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,您可能需要将其包含在错误日志中。
【讨论】:
以上是关于停止 Gradle 构建的推荐方法的主要内容,如果未能解决你的问题,请参考以下文章