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,则可能需要将其包含在错误日志中。