2014-04-01 118 views
2

我有以下结构:依赖于子项目战争任务

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

两个API网络项目中使用war插件,但其他项目只有java插件。

我想定义为根项目Heroku的一个任务,那会说:

  • 上都有了子项目执行干净任务
  • 上有各子项目执行战争任务它
  • 上有它
所有子项目执行 构建任务

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

我该怎么办这个?

回答

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

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

0

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

使用任务关系实现工作流程(dependsOnmustRunAfter等)比较困难。上述建议的解决方案并不保证在stage的范围内,清理任务在所有其他任务之前运行。

PS:build取决于war,所以你可能不必处理这两种情况。可以通过推迟dependsOn任务分辨率(例如dependsOn { p.war })来避免​​。