我想在我的代码质量报告上运行转换,以便我可以使用人机和机器可读格式。我认为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。
答案 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
)的存在来调整操作。