对子项目战争任务的依赖

时间:2014-04-01 14:29:08

标签: gradle

我有以下结构:

./build.gradle
./api
./api/build.gradle
./web
./web/build.gradle
./other
./other/build.gradle

api web 项目都使用war插件,但其他项目只有java个插件。< / p>

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

  • 对拥有它的所有子项目执行清除任务
  • 对拥有它的所有子项目执行 war 任务
  • 对拥有它的所有子项目执行构建任务

我看到了这个答案:Gradle batch task that invokes subproject and other tasks in order 但它失败了。尝试以下配置

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

我该怎么做?

2 个答案:

答案 0 :(得分:0)

错误解决方案:

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()
}

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

答案 1 :(得分:0)

Gradle目前没有一流的支持来声明工作流程,例如clean - &gt;战争。最简单的解决方案是执行gradle clean war。另一个解决方案是操纵gradle.startParameter.taskNames。例如,您可以查找stage任务名称,并将其替换为任务名称cleanbuild

使用任务关系(dependsOnmustRunAfter等)实施工作流程更加困难。上面提出的解决方案并不能保证在stage的上下文中,清除任务在所有其他任务之前运行。

PS:build取决于war,因此您可能不必处理这两种情况。推迟evaluationDependsOnChildren()任务解析(例如dependsOn)可以避免dependsOn { p.war }