我有一个多模块gradle项目,似乎我需要一些共同的任务,或者一个根任务,可以在每个子项目上运行不同的参数。我的项目结构是:
-+ parent
| /gradle
| build.gradle.kts
| settings.gradle.kts
| gradlew
| gradlew.bat
+- child1
| /build
| build.gradle.kts
+- child2
| /build
| build.gradle.kts
+- child3
| /build
| build.gradle.kts
+- child4
| /build
| build.gradle.kts
我只需要在child2
,child3
和child4
项目上运行jacoco测试覆盖率任务,具有单个最小值.
所以我不能在根build.gradle.kts
的subprojects
部分定义任务,因为它将应用于所有子项目。
作为另一种选择,似乎我可以在根build.gradle.kts
中定义一个任务,并将其称为dependsOn(":parent:myTask")
,但在这种情况下,我不能使用参数化…
我不是很熟悉这个,所以谁能解释一下正确的方式应该这样做,或者指出一个很好的例子类似的功能?
我相信有很多方法可以做到这一点,但是像这样的事情怎么样?任务可以驻留在根build.gradle
中,您可以解析项目名称并具体定义您的值(您也可以跳过不想在其中执行任务的子项目)。例如…
tasks.register("jill") {
doLast {
println("Jill was here")
}
}
allprojects {
gradle.projectsEvaluated {
var value = 0
if (project.name == "child1") value = 45
if (project.name == "child2") value = 73
if (project.name == "child3") value = 61
if (project.name == "child4") value = 38
tasks.register("jones") {
doLast {
println("PROJECT [$value]: ${project.name}")
}
}
tasks.findByPath(":jill").finalizedBy(project.tasks.findByName("jones"))
}
}
马上解释解决方案…循环遍历所有项目,根据项目名称设置value
。然后,在每个子项目中注册一个任务,它将做一些事情(mine打印项目名称和计算值)。
然后,正如您提到的,它将所有这些新任务(jones
)连接到根项目(jill
)中的一个任务。
最后,您可以简单地运行./gradlew jill
。它运行主任务,并通过在子项目中创建的所有任务来完成它,每个子项目都有自己的值。
> Task :jill
Jill was here
> Task :child4:jones
PROJECT [38]: child4
> Task :child3:jones
PROJECT [61]: child3
> Task :child2:jones
PROJECT [73]: child2
> Task :child1:jones
PROJECT [45]: child1