如何创建递归Gradle任务?

时间:2017-05-03 18:11:42

标签: gradle

我想在根项目中创建一个任务,这样当任务执行时,它只在那些具有该名称任务的子项目中执行子项目中同名的任务。

我不想硬编码任务的名称,因为以后可能会添加更多的子项目。

task checkArtifacts
subprojects.findAll { subproject ->
  subproject.getTasksByName('checkArtifacts', false)
}.forEach { task ->
  checkArtifacts.dependsOn(task)
}

不起作用,因为它看起来强制配置阶段结束并打破一些使配置阶段更改的插件。

task checkArtifacts
afterEvaluate {
  subprojects.findAll { subproject ->
    subproject.getTasksByName('checkArtifacts', false)
  }.forEach { task ->
    checkArtifacts.dependsOn(task)
  }
}

发出Could not determine the dependencies of task ':checkArtifacts'.

2 个答案:

答案 0 :(得分:2)

DomainObjectCollection中有一些方法适用于集合的未来更新。

例如all

  

对此集合中的所有对象以及随后添加到此集合的所有对象执行给定的闭包。该对象作为闭包委托传递给闭包。或者,它也作为参数传递。

matching

  

返回一个集合,其中包含此集合中符合给定闭包规范的对象。返回的集合是实时的,因此当匹配的对象添加到此集合时,它们也会在过滤的集合中可见。

类似

subprojects {
    tasks.matching { it.name == 'checkArtifacts' }.all { task ->
        rootProject.tasks.checkArtifacts.dependsOn task
    } 
} 

答案 1 :(得分:1)

您确定需要在根目录中定义此任务吗?如果您只是在根目录中调用任务'checkArtifacts',它将为每个已定义它的子项目运行它。没有必要做额外的任务。

如果您确实需要这样做,我会尝试使用TaskContainer更类似的内容:

task checkArtifacts

subprojects {
    tasks.whenTaskAdded { task ->
        if (task.name == 'checkArtifacts') {
            rootProject.tasks.checkArtifacts.dependsOn task
        }
    }
}