即使最终任务是最新的,为什么这个终结器仍在运行?

时间:2015-03-21 01:13:54

标签: gradle

我想在我的代码质量报告上运行转换,以便我可以使用人机和机器可读格式。我认为finalizedBy是理想的工具,因为根据the documentation

  

即使最终任务失败,也会执行终结器任务。

......但......

  如果最终任务没有做任何工作,则不会执行终结器任务,例如,如果它被认为是最新的

但是,即使他们最终确定的任务是最新的,我也看到转换任务正在运行。这是我的build.gradle

apply plugin: "findbugs"
apply plugin: "java"

repositories { mavenCentral() }

def findbugsJar = project.configurations.findbugs.find { it.name.startsWith("findbugs") }

tasks.withType(FindBugs) {
    reports {
        xml.destination "$buildDir/reports/${task.name}.xml"
        xml.setWithMessages(true)
    }

    def taskName = it.name
    def transformer = tasks.create(name: "transform" + GUtil.toCamelCase(taskName))

    it.finalizedBy transformer
    transformer.description "Transform report from $taskName into HTML."

    transformer << {
        ant.xslt(in: "$buildDir/reports/${taskName}.xml", out: "$buildDir/reports/${taskName}.html") {
            style {
                zipentry(zipfile: findbugsJar, name: "fancy-hist.xsl")
            }
        }
    }
}

./gradlew check的输出没有来源更改:

$ ./gradlew check
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findbugsMain UP-TO-DATE
:transformFindbugsMain
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:findbugsTest UP-TO-DATE
:transformFindbugsTest FAILED

FAILURE: Build failed with an exception.

正如您所看到的,即使transformFindbugsMain是最新的,findbugsMain仍在运行。更糟糕的是,这个简化的测试用例恰好不包含任何测试类,因此findbugsTest根本不产生输出(Gradle似乎考虑了这个&#34;最新的#34;,这似乎足够合理,我想)。结果,transformFindbugsTest完全爆炸(堆栈跟踪 - 为简洁而省略 - 表明这确实是ant.xslt无法找到源文件的结果)。

我是否误解了finalizedBy的预期行为?我的构建文件有问题吗?

我在Windows 8上运行Gradle 2.3和Java(64位)1.8.0_40。

1 个答案:

答案 0 :(得分:2)

正如@Opal所提到的,这确实看起来像个错误。下一个最小的gradle代码将重现此问题:

task taskY << {
    println 'taskY'
}

task taskX {
    outputs.upToDateWhen { true }
    finalizedBy taskY
    doLast { println 'taskX' }
}

输出:

$ ./gradlew taskX
:taskX UP-TO-DATE
:taskY
taskY

根据您的具体情况,可能的解决方法是根据相关文件($buildDir/reports/${taskName}.xml)的存在来调整操作。