当输入保持不变时,任务跳过JavaExec任务

时间:2013-12-06 19:07:07

标签: gradle

我需要在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任务可能会有所帮助,但如果我没记错的话,不推荐从其他任务手动调用任务/不良构建设计...)

1 个答案:

答案 0 :(得分:0)

问题在于这个声明:

inputs.files(compileJava.outputs.outputFiles)
outputs.files(compileJava.outputs.outputFiles)

这里你说,任务输出指向与任务输入相同的文件。这不起作用,因为任务总是过时的,因为

  1. 首次运行:(新生成的输入 - >新生成的输出)
  2. 下次运行:(编译再次运行,因为它的输出已经改变了(通过前一次运行中的字节码增强)。由于增强的类被编译任务取代,你的enhanceByteCode任务需要再次运行。... < / LI>

    您应始终使用单独的文件夹来跟踪任务的输入和输出。此外,覆盖另一个任务的输出是不好的做法,导致非增量构建/不可预测的构建结果)

    欢呼声,