Gradle:仅在任务失败时执行操作

时间:2014-10-15 17:09:03

标签: gradle build.gradle

我想打开几个"检查"的报告文件。和"测试"我在检查失败时使用的插件。我知道我can use "finalizedBy执行另一个任务,无论原始任务是否被执行。使用该知识,我尝试以下操作仅在相应任务(在此示例中为checkstyle)失败时才打开报告:

task showCheckStyleResultsInBrowser(type: Exec) {
    ext.htmlFileName = "main.html"
    executable 'open'
    args 'file:///' + checkstyleMain.reports.xml.destination.parent + "/" + ext.htmlFileName
}

task showCheckStyleResultsIfFailed {
    ext.aCheckFailed = true
    doLast {
        if (ext.aCheckFailed) {
            showCheckStyleResultsInBrowser.execute()
        }
    }
}

checkstyleMain {
    finalizedBy 'showCheckStyleResultsIfFailed'
    doLast {
        // convert the xml output to html via https://stackoverflow.com/questions/20361942/generate-checkstyle-html-report-with-gradle
        ant.xslt(in: reports.xml.destination,
                 style: new File('config/checkstyle/checkstyle-noframes-sorted.xsl'),
                 out: new File(reports.xml.destination.parent, showCheckStyleResultsInBrowser.htmlFileName))

        showCheckStyleResultsIfFailed.aCheckFailed = false
    }
}

解释(据我所知):

  • showCheckStyleResultsInBrowser是实际打开报告的任务。您可以忽略它实际执行的操作,但如果检查任务失败则应该执行该操作
  • showCheckStyleResultsIfFailed任务声明属性aCheckFailed并将其初始化为true。执行时,它会检查它是否仍然为真(这意味着检查未成功完成),如果是,则使用showCheckStyleResultsInBrowser打开报告。
  • checkstyleMain是执行实际检查的任务。我对它的结果很感兴趣。但是,我不知道如何去做。因此,在checkStyleMain任务结束时,我将aCheckFailed属性设置为false,这取决于如果以前的检查都没有失败,则只会执行最后一步。< / LI>
  • showCheckStyleResultsIfFailed设置为在checkstyleMain之后执行,无论finalizedBy是什么。这样即使checkstyleMain失败也会执行。它使用aCheckFailed属性来确定checkstyleMain是否已成功完成。

如果我完成构建,这可以正常工作。但是如果我只是进行部分重建并且checkstyleMain任务没有运行,因为它的所有结果都已经是最新的,我最终aCheckFailed为真,因为checkstyleMain没有运行,这让它看起来好像出了什么问题。

那么,当且仅当checkstyleMain任务失败时,如何执行showCheckStyleResultsInBrowser任务?此外,我的解决方案感觉相当麻烦和黑客,即使它实现了它。有更简单的方法吗?

1 个答案:

答案 0 :(得分:11)

您可以询问任务状态以确定它是否失败。

task showCheckStyleResultsIfFailed {
    onlyIf {
        checkstyleMain.state.failure != null
    }
}