【问题标题】:Gradle: Execute an action only if a task failsGradle:仅在任务失败时执行操作
【发布时间】:2014-10-15 17:09:03
【问题描述】:

我想打开我在检查失败时使用的几个“检查”和“测试”插件的报告文件。我知道我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 并将其初始化为真。当它被执行时,它会检查它是否仍然为真(这意味着检查没有成功完成),如果是,则使用showCheckStyleResultsInBrowser 打开报告。
  • checkstyleMain 是执行实际检查的任务。我对它的结果很感兴趣。但是我不知道如何到达它。因此,在checkStyleMain 任务结束时,我将aCheckFailed 属性设置为false,因为只有在之前的检查均未失败时才会执行最后一步。
  • showCheckStyleResultsIfFailed 设置为在checkstyleMain 之后执行,无论finalizedBy 是什么。这样即使checkstyleMain 失败,它也会执行。它使用aCheckFailed 属性来确定checkstyleMain 是否成功完成。

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

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

【问题讨论】:

    标签: gradle build.gradle


    【解决方案1】:

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

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

    【讨论】:

    • @PeterNiederwieser true,如果可能的话,我想使用实际的检查结果。但是现在我正在寻找如何根据任务的结果来做一些事情。但是,如果您知道如何获取违反检查样式的实际列表,那就太好了。目前,检查样式​​中不是“错误”的所有内容都会成功完成任务,这意味着我不会显示任何结果。
    • @JoachimKurz 再想一想,我不知道比这个更好的解决方案。关于您的原始代码,请注意 Task#execute 是一种内部方法,不应从用户代码中调用。相反,我会让showCheckStyleResultsIfFailed 另一个Exec 任务。这两个任务可以一次性配置,但可能不值得。
    • @PeterNiederwieser 啊,谢谢,不知道 Task#execute 是私有的。但无论如何,我完全摆脱了showCheckStyleResultsIfFailed 任务并将onlyIf 块添加到Exec-Open-Task 并制作checkstyleMain finalizedBy showCheckStyleResultsInBrowser。这样我只使用公共 API(我认为),并且只有在失败时才会执行实际的 exec 任务。
    • 这个答案的不幸部分是类型是TaskStateInternal,它是一个内部类。我确信 Gradle 团队不会因此而在很长一段时间内将其删除,但需要考虑一些事情。
    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2013-12-08
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多