2017-05-03 76 views
0

我想在根项目中创建一个任务,这样当任务执行时,它将在子项目中执行同名任务,只为具有该名称的任务的子项目执行。如何创建递归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'.

回答

1

有在DomainObjectCollection一些方法被应用到将来的更新集合。

all

执行对这个集合中的所有对象给出封闭,任何物体随后添加到此集合。该对象作为闭包代理传递给闭包。或者,它也作为参数传递。

而且matching

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

因此,像

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

你确定你需要在根所有定义的这个任务?如果你只是在根上调用任务“checkArtifacts”,它会为每个已定义的子项目运行它。没有必要完成额外的任务。

如果你需要做的,我想尝试更多的东西像这样使用TaskContainer

task checkArtifacts 

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

是的,这是事实。我忘了提及我想要另一个rootProject任务依赖于这个任务。 –