如果任务失败,则Gradle任务doLast

时间:2016-02-10 01:10:04

标签: gradle groovy build

我想要一个干净的构建,在那里你可以确切地看到发生了什么,但是所有信息都被保留了 - 所以基本上对于每个任务,我希望它将输出写入文件,并且只显示它如果任务失败

我试图在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可以随时运行吗?这样做的其他任何方式? - 特别是因为我想为我的每一项任务做这件事?

3 个答案:

答案 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()
    }
}