如何在gradle多模块项目中创建可重用任务?

yzxexxkh  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(186)

我有一个多模块的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

我只需要在child2child3child4项目上运行jacoco测试覆盖任务**,并具有单独的最小值**。
所以我不能在根目录build.gradle.ktssubprojects部分定义任务,因为它将应用于所有子项目。
另外,作为一种替代方案,似乎我可以在根build.gradle.kts中定义一个任务并将其命名为dependsOn(":parent:myTask"),但在这种情况下,我不能使用参数化...
我不是很熟悉这一点,所以谁能解释一下正确的方法,或者指出一个类似功能的好例子?

fcwjkofz

fcwjkofz1#

我相信有很多方法可以做到这一点,但是像这样的事情怎么样...任务可以存在于根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。然后,在每个子项目中注册一个任务,该任务将执行一些操作(我的任务打印项目名称和计算值)。
然后,由于您提到了它,它将所有这些新任务(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

相关问题