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
api和web项目都使用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}
)