gradle任务可以取决于另一个任务的失败吗?

例如,我有一个辅助任务,可以在浏览器中打开测试报告。我希望仅在任务“测试”失败时才显示报告,而不是像现在一样通过所有测试时才显示报告。

task viewTestReport(dependsOn: 'test') << {
    def testReport = project.testReportDir.toString() + "/index.html"
    "powershell ii \"$testReport\"".execute()
}

最佳答案

您可以尝试设置任务的finilizedBy属性,例如:

task taskX << {
    throw new GradleException('This task fails!');
}

task taskY << {
    if (taskX.state.failure != null) {
        //here is what shoud be executed if taskX fails
        println 'taskX was failed!'
    }
}

taskX.finalizedBy taskY

您可以找到说明gradle的用户指南in chapter 14.11 "Finalizer tasks"。不久,由于文档:



因此,您只需要使用TaskState检查完成任务的状态,如果失败,请执行所需的操作。

更新:
不幸的是,由于总是对所有任务执行配置,因此似乎无法创建一些自定义任务来设置标志以在脚本内显示报告。在执行阶段也是不可能的,因为如果预览运行的任务失败,则不会调用该任务。但是您可以根据需要执行以下操作,提供构建脚本参数,例如:
task viewTestReport << {
    if (project.hasProperty("showReport") && test.state.failure != null) {
        //here is what shoud be executed on taskX fail
        println 'test was failed!'
    }
}
test.finalizedBy(viewTestReport)

在这种情况下,如果您要在测试任务中获取报告失败,则在调用任何gradle任务时,必须提供-PshowReport参数。例如,如果您致电:
gradle test -PshowReport

然后如果测试任务失败,将显示报告,但是如果您调用它:
gradle test

在任何情况下都不会显示报告。

10-08 03:02