引言
上一阶段,我们了解了Gradle的生命周期
知道了有这么一个过程:Gradle开始于初始化Project,然后到配置形成task的拓扑图,再到根据拓扑图执行一个个task
这阶段,我们将学习Gradle模块中的Project相关知识
概念
Project(工程)在Gradle中,是一个比较重要的概念,是Gradle整个API的入口
下面是一个demo的工程目录如下:
在我们程序员的视角中,会认为“DaviPlu”是工程,“app”和“lifecycle-plugin”是模块
但是在Gradle视角中,却是不一样的,“DaviPlu”,“app”和“lifecycle-plugin”都会认为是工程( Project ),具体如下图(执行 “./gradlew projects” 后):
我们可以看到,执行了“ ./gradlew projects ” 命令后,会把当前的Gradle的Project打印出来,同时可以注意到,其组织方式是以树的方式实现的(根project为“DaviPlu”,其他为子project)
每一个Project,都会有一个对应的“ build.gradle ”文件对应,我们的Gradle编程,基本都是在“ build.gradle ”文件中编写
每一个子project,都会有一个输出,比如:“app”是一个应用类型的,那么输出的就是apk;“lifecycle-plugin”是一个lib类似的,输出的就是aar或者jar
Project的API家族
Project相关的API相对比较多,但是大致可以分为如下几类:
1)task API
- 对当前project,新增或者修改task的能力
复制代码
2)属性 API
- project添加额外属性的能力
复制代码
3)Project API
- 操作和管理父project和子project的能力
复制代码
4)Gradle 生命周期
- 这个上次有学习,具体见:https://juejin.cn/post/6960834289755750408
复制代码
5)file API
- 和一开始学习groovy基础知识中的file文件操作不同,具体见:https://juejin.cn/post/6959482085509693476#heading-8
- 主要是操作当前gradle相关的文件为主
复制代码
6)其他
- 相对零散,如:gradle添加依赖/配置/引入外部文件等内容
复制代码
Project API
主要是:操作和管理父project和子project的能力
每一个project,都有一个build.gradle文件,然后该文件编译的时候,会被编译为project的字节码,所以在build.gradle文件里面写的内容,其实就是在project类的内部写的
假如我们有这么一个demo工程,其依赖关系为:
DaviPlu
- app
- lifecycle-plugin
有3个project,那么就有对应的3个build.gradle文件
接下来我们分别在这3个build.gradle文件中,进行学习API
1)获得所有的project
代码(在3个gradle文件中都执行同样代码):
this.getAllprojects().eachWithIndex { Project entry, int i ->
println "【getAllprojects().eachWithIndex-->】遍历所有的project name : " + entry.name
println "【getAllprojects().eachWithIndex-->】遍历所有的project index : " + i
}
复制代码
执行结果:
【DaviPlu】
【getAllprojects().eachWithIndex-->】遍历所有的project name : DaviPlu
【getAllprojects().eachWithIndex-->】遍历所有的project index : 0
【getAllprojects().eachWithIndex-->】遍历所有的project name : app
【getAllprojects().eachWithIndex-->】遍历所有的project index : 1
【getAllprojects().eachWithIndex-->】遍历所有的project name : lifecycle-plugin
【getAllprojects().eachWithIndex-->】遍历所有的project index : 2
复制代码
【app】
【getAllprojects().eachWithIndex-->】遍历所有的project name : app
【getAllprojects().eachWithIndex-->】遍历所有的project index : 0
复制代码
【lifecycle-plugin】
【getAllprojects().eachWithIndex-->】遍历所有的project name : lifecycle-plugin
【getAllprojects().eachWithIndex-->】遍历所有的project index : 0
复制代码
2)获得父project
代码(在3个gradle文件中都执行同样代码):
if (this.getParent() == null) {
println "我是根project,所以我没有父project !!! "
} else {
println "获得父project : " + this.getParent().name
}
复制代码
执行结果:
【DaviPlu】
我是根project,所以我没有父project !!!
复制代码
【app】
获得父project : DaviPlu
复制代码
【lifecycle-plugin】
获得父project : DaviPlu
复制代码
3)获得根Project
代码:
this.getRootProject().name
复制代码
4)根Project管理子Project相关API
if (this.getParent() == null) {
println "我是根project !!! "
project('app', { Project p ->
println "根project中操作 : " + p.name
//这里其实进到了app中的gradle文件里面,可以自由的操作
})
project('lifecycle-plugin', { Project p ->
println "根project中操作 : " + p.name
//这里其实进到了app中的gradle文件里面,可以自由的操作
})
}
复制代码
5)当前结点project配置和所有子project的配置
allprojects {
println "【allprojects】当前结点project配置和所有子project的配置 --> " + project.name
}
复制代码
6)所有子project的配置(不包含当前的project)
subprojects {
println "【subprojects】所有子project的配置(不包含当前的project) --> " + project.name
}
复制代码
7)当前project是否存在xx插件
if (project.plugins.hasPlugin('com.android.application')) {
println "【project.plugins.hasPlugin】当前project存在 application插件.."
}
复制代码
结尾
哈哈,该篇就写到这里(一起体系化学习,一起成长)