build议停止Gradle构build的方法

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

我通常从org.gradle.api包中引发相关的exception,例如InvalidUserDataException ,当某人input了某些无效的内容时,或者GradleScriptException更常见的错误。

如果您想要停止当前的任务或动作,并转到下一个,则还可以引发StopActionException

如果你想停止构build,扔:

 throw new GradleException('error occurred') 

或抛出上述exception的子类。 一些子类exception实际上只是失败了当前的任务,但继续构build。

目前还没有专门的方法,虽然已经有讨论join。

推荐的停止Gradle构build的方法是引发exception。 由于Groovy没有检查exception,并且默认情况下Gradle不打印exceptiontypes,所以抛出exception并不重要。 在构build脚本中,经常使用GradleException,但Groovy断言也是合理的(取决于具体情况和受众)。 重要的是提供一个清晰的信息。 添加一个原因(如果可用)有助于debugging( --stacktrace )。

Gradle提供了专门的exceptiontypesStopExecutionException / StopActionException用于停止当前任务/任务操作,但继续生成。

另一个选项,如果你没有任何能够赶上例外的愿望是调用ant失败的任务。 在我看来,读起来稍微容易些,而且你可以在不使用-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_yatesbuild议的那样抛出标准gradleexception来查看抛出什么exception。

抛出一个简单的GradleException在停止构build脚本中起作用。 这对检查所需的环境设置非常有用。

 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 ,没有输出。 任何其他值将打印standardOutput并暂停构build。

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