提问者:小点点

在子项目中修改gradle任务


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

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文件没有。这意味着项目promA3-main、promB3-main和promC3-main具有bootWar任务,它会禁用war任务。

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

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

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

总结一下:

root build. gradle没有war、bootWar或Spring Boot插件,但有自定义PrintTask任务

“-main”子项目有bootWar和Spring boot插件,他们也有war插件,但是因为我使用的是Spring Boot 2 gradle插件,war任务不会生成war。

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

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

我希望这有意义。


共1个答案

匿名用户

哟,想通了。

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

我知道没有人关心,但是这样我迭代了每个类型为War的任务,如果任务名称不是bootWar(因为循环依赖),那么依赖于我的自定义打印任务,也依赖于位于我当前迭代的子项目中的bootWar任务,这就是它看起来愚蠢的原因。

很简单,不知道我是怎么错过这个的…看起来极其丑陋,但它有效!