我有以下结构:
./build.gradle
./api
./api/build.gradle
./web
./web/build.gradle
./other
./other/build.gradle
api 和 web 项目都使用war
插件,但其他项目只有java
个插件。< / p>
我想在root项目中为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 :(得分: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
任务名称,并将其替换为任务名称clean
和build
。
使用任务关系(dependsOn
,mustRunAfter
等)实施工作流程更加困难。上面提出的解决方案并不能保证在stage
的上下文中,清除任务在所有其他任务之前运行。
PS:build
取决于war
,因此您可能不必处理这两种情况。推迟evaluationDependsOnChildren()
任务解析(例如dependsOn
)可以避免dependsOn { p.war }
。