我需要在gradle配置中引入一个字节码增强步骤。我能够相应地配置我的JavaExec任务,但Gradle不会跳过它,即使声明的输入被识别为'最新':
task lazyEnhance(dependsOn: [compileJava, processResources]) {
inputs.files(compileJava.outputs.outputFiles)
outputs.files(compileJava.outputs.outputFiles)
doLast {
println "Doing bytecode enhancements..."
}
}
task datanucleusEnhance(type: JavaExec, dependsOn: [compileJava, processResources]) {
classpath = configurations.compile + sourceSets.main.output.with { files(it.classesDir, it.resourcesDir) }
main = 'org.datanucleus.enhancer.DataNucleusEnhancer'
args = "-api JPA -pu DictionaryModels".tokenize()
inputs.files(compileJava.outputs.outputFiles)
outputs.files(compileJava.outputs.outputFiles)
}
//this action task is skipped as intended
classes.dependsOn(lazyEnhance)
//the 'real' enhancement task of type JavaExec, however, is never skipped
classes.dependsOn(datanucleusEnhance)
(您可以在此处找到完整的构建脚本以获取更多上下文:https://gist.github.com/neradis/7830434)
Gradle的硬连线行为是否假设Exec任务应始终执行,而不管输入是否保持不变?如果是这样,是否可以更改单个JavaExec任务声明,如果没有,可以看作哪种解决方法可以视为最佳实践? (在lazyEnhance的doLast操作闭包中启动实际的JavaExec任务可能会有所帮助,但如果我没记错的话,不推荐从其他任务手动调用任务/不良构建设计...)
答案 0 :(得分:0)
问题在于这个声明:
inputs.files(compileJava.outputs.outputFiles)
outputs.files(compileJava.outputs.outputFiles)
这里你说,任务输出指向与任务输入相同的文件。这不起作用,因为任务总是过时的,因为
您应始终使用单独的文件夹来跟踪任务的输入和输出。此外,覆盖另一个任务的输出是不好的做法,导致非增量构建/不可预测的构建结果)
欢呼声,
勒