修改子项目中的 gradle 任务

Modifying gradle task in a subproject

所以,假设我有这样的项目结构:

Root
    projA
        projA1-api
        projA2-core
        projA3-main
    projB
        projB1-api
        projB2-core
        projB3-main
    projC
        projC1-api
        projC2-core
        projC3-main
    and so on...

一些子项目(以“-main”结尾的子项目)应用了 warspring boot 插件,根 build.gradle 文件没有。 这意味着项目 projA3-main、projB3-mainprojC3-main 具有禁用 warbootWar 任务]任务。

现在,问题在于我们的 jenkins 管道通过执行 gradle war 命令构建 wars,这很糟糕并且无法更改。

所以,我想做的是修改每个包含 war 插件的子项目中的 war 任务,将其设置为依赖于 bootWar 任务。我可以通过将 war.dependsOn bootWar 添加到子项目的 build.gradle 文件中来做到这一点,但我想将该代码提取到根 build.gradle.

此外,我希望 war 任务也执行在根 build.gradle 中定义的另一个任务(我们称之为 customPrintTask),它只是将内容打印到某个文件中。

总结一下:

Root build.gradle doesn't have, war, bootWar or Spring Boot plugins, but has the customPrintTask task

"-main" subprojects have bootWar and spring boot plugins, and they also have the war plugin, but because I am using Spring Boot 2+ gradle plugin, the war task does not generate the war.

基本上,我想要这样的东西:

allprojects {
    if (project.plugins.hasPlugin("war")) {
        war.dependsOn bootWar
        war.finalizedBy customPrintTask
    }
}

我希望这是有道理的。

哟,想通了。

allprojects {
    tasks.withType(War) {
        if (it.name != "bootWar") {
            dependsOn(customPrintTask)
            dependsOn(":" + it.project.name.replace("-main", "") + ":" + it.project.name + ":bootWar")
        }
    } 
}

我知道没有人在乎,但通过这种方式,我迭代了类型为 War 的每个任务,如果任务名称不是 bootWar(因为循环依赖),则取决于我的自定义打印任务并且还依赖于位于我当前正在迭代的子项目中的 bootWar 任务,这就是它看起来很笨的原因。

非常简单,不知道我是怎么错过这个的...看起来非常丑陋,但它确实有效!