【问题标题】:Dependency on subprojects' war task对子项目战争任务的依赖
【发布时间】:2014-04-02 03:58:36
【问题描述】:

我有以下结构:

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

apiweb项目都使用war插件,但other项目只有java插件。

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

  • 对所有拥有它的子项目执行clean任务
  • 对所有拥有它的子项目执行war任务
  • 对所有拥有它的子项目执行build任务

我看到了这个答案: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

我该怎么做?

【问题讨论】:

    标签: gradle


    【解决方案1】:

    错误的解决方法:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多