依赖于失败的Gradle任务

5

一个Gradle任务能否依赖于另一个任务的失败?

例如,我有一个辅助任务,它会在浏览器中打开测试报告。我希望报告只在“test”任务失败时出现,而不是像现在一样在所有测试都通过时出现。

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

3
您可以尝试设置任务的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用户指南第14.11章“Finalizer tasks”中找到解释。简而言之,根据文档:

即使最终任务失败,也将执行Finalizer任务。

因此,您只需使用TaskState检查finilized任务的状态,如果失败,则执行所需操作。 更新: 不幸的是,由于配置始终对所有任务执行,似乎不可能创建一些自定义任务来设置标志以显示脚本内的报告。在执行阶段也不可能,因为如果先前运行的任务失败,该任务将不会被调用。但是,您可以提供构建脚本参数来执行所需操作,例如:
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

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


这个跟你描述的一样能够工作,但是 gradle taskY 不会执行 taskX,相反,当 taskY 失败时,gradle taskX 会执行 taskY。就我的例子而言:gradle viewTestReport 不会执行 test,而 gradle test 则会在失败时执行 viewTestReport。我之前想要的是相反的情况。 - cheezsteak
@cheezsteak 我已经拿到你想要的东西了。不幸的是,唯一可行的方法是提供构建脚本参数并直接使用测试任务。在这种情况下,你可以按需展示报告运行测试,只有在需要时才会显示。 - Stanislav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接