Groovy 聚合Gradle中的任务

Groovy 聚合Gradle中的任务,groovy,gradle,Groovy,Gradle,我正在处理一个依赖于其他梯度任务的梯度任务,即聚合任务。聚合任务要求其他任务也以某种线性顺序运行 注意:其他任务必须能够独立运行。任务之间的依赖关系只有在运行聚合任务时才有意义 我的第一次尝试是使用someTask.execute(),但后来我意识到这不是Gradle的方式,也就是说,它不是受支持的功能,内部API可能会发生变化 task aggregate() { doFirst { // Need to set properties required by other task

我正在处理一个依赖于其他梯度任务的梯度任务,即聚合任务。聚合任务要求其他任务也以某种线性顺序运行

注意:其他任务必须能够独立运行。任务之间的依赖关系只有在运行聚合任务时才有意义

我的第一次尝试是使用someTask.execute(),但后来我意识到这不是Gradle的方式,也就是说,它不是受支持的功能,内部API可能会发生变化

task aggregate() {

  doFirst {
    // Need to set properties required by other tasks
    project.ext.somePropRequiredByTask1 = propertyX + "-" propertyY
  } 

  doLast {
     task1.execute()
     task2.execute()
     task3.execute()
  }
} 
在阅读了创建聚合任务的相关内容后,以下是我当前的解决方案:

task aggregate() {
  // Only configure task if the task is exlicitly run
  if (gradle.startParamter.taskNames.contains("aggregate") {
    project.ext.somePropRequiredByTask1 = propertyX + "-" propertyY
    chainTaskDependencies([task1, task2, task3])   
  }
}

// Create a strict dependsOn dependency order for the tasks in the task list
def chainTaskDependencies(List<Task> tasks) {
  def taskNames = tasks.collect { it.name}
  println "Run tasks in this order: " taskNames.join " -> "

  def reversed = tasks.reverse()
  for (int i = 0; i< reversed.size() -1 ; i ++) {
    reversed[i].dependsOn(reversed[i+1])
  }
}
任务聚合(){
//仅当任务已完全运行时配置任务
if(gradle.startParamter.taskNames.contains(“聚合”){
project.ext.somePropRequiredByTask1=propertyX+“-”propertyY
chainTaskDependencies([task1、task2、task3])
}
}
//为任务列表中的任务创建严格的依赖顺序
def chainTaskDependencies(列出任务){
def taskNames=tasks.collect{it.name}
println“按以下顺序运行任务:“taskNames.join”->”
def reversed=tasks.reverse()
对于(int i=0;i

这是创建聚合任务相关性的正确方法吗?任务之间的顺序是线性的?如何改进它?

正如Gradle团队成员和Spock发明家Peter Neiderweiser所说:

您不能,因为任务(实例)将在每个生成中最多执行一次。相反,方法是声明多个任务实例。可以通过将任务声明放入循环中,将其放入方法中并多次调用,或者通过编写任务类并多次实例化来执行。然后,您将添加一个其他任务,该任务依赖于所有批量任务。Ass在批量任务之间调整执行顺序是不相关的,就是这样

他还建议为此目的使用

OP也发布了他或她设计的解决方案,所以你也可以看看

B.mustRunAfter(A)
这意味着如果A和B都运行,那么B必须在A之后运行。B可以自己运行,没有问题

因此:


只提取shutdownVM、waitForVMShutdown和回滚到任务调用的函数/闭包怎么样?然后您可以自由地以任意方式组合它们


我发现在类似情况下,这是最灵活的选择。

问题是,其他任务必须能够独立运行。任务之间的依赖关系只有在运行聚合任务时才有意义。感谢您指出这一点,我将更新我的问题以适应这一点。如果我正确理解其他答案,他会回答建议您动态创建任务。我必须使用在其他上下文中使用的现有任务。这与我的解决方案有什么不同,除了您已全局硬编码任务依赖关系这一事实之外?任务之间的依赖关系仅在运行聚合任务的上下文中才有意义。我不知道实际上,看看你的解决方案是如何实现你想要的——除非你想在if中调用chainTaskDependencies?在任何情况下,我都没有声明A、B和C之间的任何依赖关系;只声明它们与聚合之间的依赖关系。“mustRunAfter”不是依赖关系,而是一种排序——事实上,Gradle非常坚持依赖Cies不应用于订购。B.必须在(A)之后运行意味着任何时候B和A一起运行时,它们都必须按该顺序运行。如果它们不一起运行,则没有任何效果。我对您的陈述感兴趣,即“任务之间的依赖关系仅在运行聚合任务的上下文中才有意义”。我想您是在谈论排序?B.mustRunAfter(A)是真的这意味着它们在任何时候一起运行时都会按该顺序运行,而不仅仅是在由特定的聚合触发时。你能解释一下为什么这对你不起作用吗?也许可以举个例子?好吧,我的具体用例是这样的(简化的):任务A=关机虚拟机,任务B=等待虚拟机关机,任务C=回滚到初始快照。任务A和B之间的依赖关系对于关机+等待+回滚的聚合任务是有意义的,但一般来说,我不希望关机和等待实际关机完成之间存在依赖关系。有时这是有意义的,有些情况下很抱歉,chainTaskDependencies()应该在中,如果正如您所指出的,我修复了我的示例。
task A
task B
task C
task aggregate(dependsOn(['A', 'B', 'C'])

C.mustRunAfter(B)
B.mustRunAfter(A)