替代从任务中调用任务,Gradle

时间:2017-02-19 01:06:48

标签: java gradle

我有一个自定义Gradle插件,它将从模板文件生成Java文件。我在不同的位置有几个这样的模板文件,我需要“编译”所有这些文件来生成我需要的Java文件。有了这些文件后,我想将它们打包成.jar。

我的第一个想法是我从其他任务中执行自定义插件中的“编译”任务。类似的东西:

task compileFromLocationA <<{
    compileTemplate.execute()...
}

task compileFromLocationB
    ...

packageJar(depends: compileFromLocationA, compileFromLocationB)
    ...

但是,您无法以编程方式从另一个任务中调用任务。我听说我可以使用dependsOnfinalizedBy解决这个问题,但我无法弄清楚如何在这里应用这些关键字。对于这样的事情,“最佳实践”是什么?我是Gradle的新手,并且无法使用官方文档。

2 个答案:

答案 0 :(得分:2)

您可以使用dependsOn来完成此操作。 这是一个例子:

apply plugin: 'java'

task taskA <<{
    println 'task A'
}

task taskB (type:Copy){
    println 'B'
}

task taskC (type:Copy){
    println 'C'
}
task taskBC (dependsOn:['taskB','taskC'])<<{
    println 'BC'
}
taskBC.mustRunAfter taskA

您还可以使用mustRunAfter确保任务始终在另一项任务之后运行。

答案 1 :(得分:1)

你可以:

1)一些功能包含在“普通”Groovy函数中:

def doSomething() {
  // ...
}

task taskA {
  description = 'Description for this task'
  doLast {
    doSomething()
  }
}

2)在任务之间使用mustRunAfter(小心,这可能会变得混乱,具体取决于您的配置大小)

task taskA {
  description = 'Description for task A'
  doLast {
    // ...
  }
}

task taskB {
  description = 'Description for task B'
  doLast {
    // ...
  }
}

taskB.mustRunAfter taskA

3)在任务之间使用dependsOn

task taskA {
  description = 'Description for task A'
  doLast {
    // ...
  }
}

task taskB(dependsOn: taskA) {
  description = 'Description for task B'
  doLast {
    // ...
  }
}