我想要一个干净的构建,在那里你可以确切地看到发生了什么,但是所有信息都被保留了 - 所以基本上对于每个任务,我希望它将输出写入文件,并且只显示它如果任务失败
我试图在gradle中实现这一点 - 但是因为如果任务失败,doLast没有运行,我被击败了。这是我的"几乎"工作模式:
task fakeTask( type: Exec ) {
standardOutput = new ByteArrayOutputStream()
commandLine 'cmd', '/c', 'silly'
doLast {
new File("build.log") << standardOutput.toString()
if (execResult.exitValue != 0) println standardOutput.toString()
}
}
doLast可以随时运行吗?这样做的其他任何方式? - 特别是因为我想为我的每一项任务做这件事?
答案 0 :(得分:5)
在您的任务定义中添加ignoreExitValue true
,以便在退出值为非零时禁止抛出异常。
答案 1 :(得分:3)
这是我的最终解决方案:
tasks.withType( Exec ) {
standardOutput = new ByteArrayOutputStream()
ignoreExitValue = true
doLast {
new File("gradle.log") << standardOutput.toString()
if (execResult.exitValue != 0)
{
println standardOutput.toString()
throw new GradleException(commandLine.join(" ") + " returned exitcode of " + execResult.exitValue )
}
}
}
答案 2 :(得分:0)
您可以使用https://docs.gradle.org/current/userguide/build_lifecycle.html#sec:task_execution中记录的任务图来在任务运行后执行代码。
gradle.taskGraph.afterTask { task, state ->
if (task instanceof ExecTask && state.failure) {
file('gradle.log') << standardOutput.toString()
}
}