Gradle 为什么即使完成的任务是最新的,此终结器仍在运行?
我想在代码质量报告上运行转换,这样就可以将它们转换为人类可读和机器可读的格式。我认为,Gradle 为什么即使完成的任务是最新的,此终结器仍在运行?,gradle,Gradle,我想在代码质量报告上运行转换,这样就可以将它们转换为人类可读和机器可读的格式。我认为,finalizedBy将是用于此目的的理想工具,因为根据: 即使完成的任务失败,也将执行终结器任务 ……但是 如果最终确定的任务没有执行任何工作,例如如果它被认为是最新的,则不会执行最终确定器任务 但是,我看到转换任务正在运行,即使它们完成的任务是最新的。这是我的构建。gradle: apply plugin: "findbugs" apply plugin: "java" repositories { ma
finalizedBy
将是用于此目的的理想工具,因为根据:
即使完成的任务失败,也将执行终结器任务
……但是
如果最终确定的任务没有执行任何工作,例如如果它被认为是最新的,则不会执行最终确定器任务
但是,我看到转换任务正在运行,即使它们完成的任务是最新的。这是我的构建。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")
}
}
}
}
如您所见,transformFindbugsMain
正在运行,即使findbugsMain
是最新的。更糟的是,这个简单的测试用例恰好不包含测试类,所以<代码> FunBugStest根本没有输出(Gealle似乎考虑到这个“最新的”),我想这似乎是合理的。因此,transformFindbugsTest
完全爆炸了(堆栈跟踪——为了简洁起见这里省略了——表明这确实是ant.xslt无法找到源文件的结果)
我是否误解了由完成的的预期行为?我的构建文件有问题吗
我在Windows 8上运行Gradle 2.3和Java(64位)1.8.040。正如@Opal提到的,这看起来确实像一个bug。下一个最小梯度代码将重新处理此问题:
task taskY << {
println 'taskY'
}
task taskX {
outputs.upToDateWhen { true }
finalizedBy taskY
doLast { println 'taskX' }
}
根据您的具体情况,一个可能的解决方法是根据相关文件($buildDir/reports/${taskName}.xml
)的存在来调整操作。这将是一个相当大的错误,您能提供一个可复制的示例吗?@Opal-whoops;构建脚本中有一个输入错误。现在,它应该可以作为一个完整的例子运行了。谢谢你的确认。
task taskY << {
println 'taskY'
}
task taskX {
outputs.upToDateWhen { true }
finalizedBy taskY
doLast { println 'taskX' }
}
$ ./gradlew taskX
:taskX UP-TO-DATE
:taskY
taskY