在子项目中修改Gradle任务

时间:2018-08-02 11:58:04

标签: gradle build.gradle war subproject spring-boot-gradle-plugin

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

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插件,而root build.gradle文件则没有。 这意味着项目 projA3-main,projB3-main projC3-main 具有bootWar任务,该任务禁用了war任务。

现在,问题出在我们的詹金斯管道通过执行gradle war命令来制造战争,这一命令很糟糕,无法更改。

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

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

总结:

  

root build.gradle没有war,bootWar或Spring Boot插件,但是具有customPrintTask任务

     

-main ”子项目具有bootWar和spring boot插件,它们也具有war插件,但是因为我使用的是Spring Boot 2+ gradle插件,所以war任务不会产生war

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

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

我希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

是的,知道了。

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

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

这很简单,不确定我是如何错过这个的...看起来非常丑陋,但是有效!