如何仅在构建失败后才在 gradle 中执行任务

How to execute a task in gradle only after build failed

我在 biuld.gradle 中有以下代码:

task generateReport(type: Exec){
    onlyIf{
        project.getState().failure
    }
    doLast{
        executable "generateReport.bat"
    }
}

tasks.withType(Test)*.finalizedBy generateReport

我以前试过:

task generateReport(type: Exec){
    executable "generateReport.bat"
}

tasks.withType(Test)*.finalizedBy generateReport

gradle.afterProject {project, projectState ->
    if (projectState.failure) {
        doLast{
            generateReport
        }
    }
}

还有其他例子,但都没有用..

我做错了什么?

您需要挂接到 buildFinished 生命周期事件,如下所示:

gradle.buildFinished { buildResult ->
    if (buildResult.failure) {
        println "Build Failed!"
    } else {
        println "Build Succeeded!"
    }
}

Project.state是项目的评估状态,不是某种执行状态。如果你想在构建失败时做一些事情,你应该做 gradle.addBuildListener() 并在 BuildListener 中实现方法 buildFinished() ,你可以在其中检查 result.failure 以查看构建是否失败.如果你想对每个失败的测试尝试执行一些操作,你应该使用 gradle.addListener() 并给它一个 TestListener 的实现,你可以在其中对失败的测试或测试套件执行操作。或者,您也可以使用 testTask.addTestListener() 将测试侦听器仅添加到特定的测试任务。或者为了让它更好,你可以做 testTask.afterTest { ... }testTask.afterSuite { ... }.

首先,您必须使用 BuildListener,因为它已经在其他答案中提到过。但请注意,您不能像 generateReport 那样调用某些任务。所以你宁愿在监听器的闭包中使用 exec ,如:

gradle.buildFinished { buildResult ->
    if (buildResult.failure) {
        exec {
            executable "generateReport.bat"
        }
    }
}