需求
各子模块添加一个打包任务patch,输出各子模块打包结果。根模块也添加一个patch任务,要求在所有子模块的patch任务执行完后,再执行根模块的patch任务,以便对合子模块输出的结果做处理。
思路
gradle多模块工程中,父子模块若存在同名task。那么在执行task里,会先执行父模块的task,然后再执行子模块task。如果想先执行子模块task,再执行父模块task,则需要通过dependsOn方法指定依赖。
解决方案:
很明显需要用dependsOn方案来实现。只是有个问题,子模块有可能后续还会继续添加的,不想在添加模块后还要再手修改gradle文件要怎么做呢?此时groovy脚本就用上了,直接上脚本。
subprojects {
// ...
task patch {
// 子模块执行的动作
}
// ...
}
task patch {
// 遍历子模块,组装依赖数组
def subPatchName = rootProject.subprojects.collect {
if (null!=it && !it.name.equalsIgnoreCase('***')) {
':'+it.name+':patch'
}
}
// 排除为空的依赖项
subPatchName = subPatchName.findAll {
it != null
}
dependsOn subPatchName // 设置依赖
doLast {
// 执行完子模块后要执行的动作写这里
}
}
Gradle个人感觉是ant和maven的结合体。可以方便的做依赖管理,可以很方便地从maven项目迁移,同时可以方便地定制任务,实现个性化的需求。gradle采用groovy DSL脚本作为配置语言,而groovy本身属于JVM系语言,JAVA程序员很容易就能上手写groovy,比起写JAVA来还爽。