Gradle 对子项目的依赖性';战争任务

Gradle 对子项目的依赖性';战争任务,gradle,Gradle,我的结构如下: ./build.gradle ./api ./api/build.gradle ./web ./web/build.gradle ./other ./other/build.gradle api和web项目都使用war插件,但other项目只有java插件 我想在根项目中为heroku定义一个任务,即: 对所有包含清理任务的子项目执行清理任务 对所有具有war任务的子项目执行该任务 在所有具有构建任务的子项目上执行该任务 我看到了这个答案: 但它失败了。尝试了以下配置 ta

我的结构如下:

./build.gradle
./api
./api/build.gradle
./web
./web/build.gradle
./other
./other/build.gradle
apiweb项目都使用
war
插件,但other项目只有
java
插件

我想在根项目中为heroku定义一个任务,即:

  • 对所有包含清理任务的子项目执行清理任务
  • 对所有具有war任务的子项目执行该任务
  • 在所有具有构建任务的子项目上执行该任务
我看到了这个答案: 但它失败了。尝试了以下配置

task stage() {
    dependsOn subprojects.clean
    dependsOn subprojects.war
    dependsOn subprojects.build
}
并获取以下错误:

* What went wrong:
A problem occurred evaluating root project 'baltona-mdm'.
> Could not find property 'war' on project ':api'.
(api
war
插件,如果我取消对任务阶段的注释,我可以运行
gradle:api:war


如何执行此操作?

错误的解决方案:

Could not find property 'war' on project ':api'
是用来

evaluationDependsOnChildren()
然而,对于标题中的问题,我提出了如下建议:

task stage() {

    subprojects.each({p ->
            dependsOn p.clean
        if(hasWarTask(p)) {
            dependsOn p.war
        } else {
            dependsOn p.build
        }
    })
}

private boolean hasWarTask(Project p) {
    !p.getTasksByName("war", false).isEmpty()
}

我不喜欢它,所以如果有人有更好的解决方案,我愿意寻找替代方案。

Gradle目前没有一流的工作流声明支持,例如clean->war。最简单的解决方案就是执行
gradlecleanwar
。另一个解决方案是操纵
gradle.startParameter.taskNames
。例如,您可以查找
阶段
任务名称,并将其替换为任务名称
clean
build

使用任务关系(
dependsOn
mustRunAfter
等)实现工作流更加困难。您上面提出的解决方案不能保证在
阶段
的上下文中,clean任务在所有其他任务之前运行

PS:
build
取决于
war
,因此您可能不必同时处理这两种情况
evaluationDependsOnChildren()
可以通过延迟
dependsOn
任务解决来避免(
dependsOn{p.war}