进行本章节的学习,请按照我提供的方式进行食用效果会更佳哦!
打开As工程,根据下面的例子练习起来
打开As工程,根据下面的例子练习起来
打开As工程,根据下面的例子练习起来
好了,下面请享用
project相当于Android中的activity的入口一样,是构建gradle程序的入口,下面让我们来学习一下吧!
了解project
在gradle中Android工程中的每一个module都是一个project,我们可以通过执行gradlew projects来查看,其实执行的project命令就是执行了一个Task任务,自然而然的就执行了gradle的生命周期。
注意:判断是不是一个gradle的project的关键就是是否包含build.gradle文件,如果将build.gradle文件删除掉,那么这个目录就相当于一个普通的文件夹,只不过存放了大量的文件而已。
gradle中的project是通过树管理结构的方式来管理所有的子project,虽然说子project可以继续嵌套project,但是常规的写法中不建议再继续嵌套,一个子project就是一个输出。
project核心api
在了解project的api之前,我们先看下图,了解下project api的组成部分
通过此图,我们发现project api是由6部分组成,那么我们在学习的时候就可以通过分组的方式进行学习。
我们按照颜色来区分每个部分的作用(紫色、绿色、橙色、黄色)
紫色:当前project拥有操作父project和管理子project的能力,管理生命周期的能力
绿色:新增task或者是project使用已有task的能力
橙色:为project添加额外属性的能力
黄色;操作该project中的文件的能力
- project实战
请注意:下列代码操作都必须要build.gradle文件中执行。
- project相关API(以下代码都是在配置阶段中执行)
//获取相关中的所有project,相当于gradlew projects的操作
this.getAllprojects()
下面通过脚本的方式同样可以输出所有的projects内容,等价于getAllprojects方法
getProjects()
def getProjects(){
println '--------------------'
println 'Root Projects'
println '--------------------'
println '--------------------'
this.getAllprojects().eachWithIndex{ Project project, int i ->
if (i==0){
println "Root Projects ':${project.name}'"
}else {
println "+--- project ':${project.name}' "
}
}
}
想要让上面的脚本生效,我们只需要随便执行一个task即可,比如gradlew clean操作,结果如下:
此时我们已经获取到了getProjects方法中的内容
思考:通过脚本的方式如何获取所有的子project信息,并输出?(5分钟思考时间)
好了,假装5分钟过去了,现在宣布答案:
getSubProjects()
def getSubProjects() {
println '--------------------'
println 'Sub Projects'
println '--------------------'
println '--------------------'
this.getAllprojects().eachWithIndex { Project project, int i ->
println "+--- project ':${project.name}' "
}
}
今日一练
在每个module的build.gradle中执行上述代码,看下会输出什么?
----------------------------分割线----------------------------
刚才我们说了如何获取子project,现在我们看下如何获取到父project,代码奉上:
/**
* 获取父project name
* @return
*/
def getParentProject(){
def name=this.getParent().name
println "the parent project name is :${name}"
}
今日问答
Q:在每个build.gradle文件中操作后你会发现,当你在root project(即项目顶层)中的build.gradle执行该方法的时候会报错,原因是什么呢?
A:原因就是它已经是顶级容器了,没有父类了,所以再去获取它的顶级当然就是不存在了的。
下面我们再来一个获取顶级project
/**
* 获取顶级Project name
* @return
*/
def getRootPro(){
def name=this.getRootProject().name
println "the parent project name is :${name}"
}
今日问答
Q:为什么getParent获取的时候会有null的存在,而getRootProject却不会有null的现象?
A:原因其实在文章的最开始就已经提到过了,因为project是已树的形式进行管理,当树达到根节点的时候,当然就没有节点了,此时当然就是null了,而getRootProject一直获取的都是根节点,当然可以获取到啦。
上面我们说过根工程可以管理我们所有的子工程,那么能不能在根工程通过具体的api去配置子工程呢?
注意:以下代码都在根project中执行
project(){}
源码解析:
path:要操作子project的路径
configureClosure:闭包参数,为指定路径的project指定参数,闭包的参数就是当前的project
Project project(String path, Closure configureClosure);
project('app') { Project pro ->
println pro.name
//指定输出
apply plugin: 'com.android.application'
//指定组
group 'com.test'
//指定版本号
version '1.0.0-release'
//指定依赖
dependencies {}
android {}
}
因为闭包参数是Project,那么我们获取Project的信息进行指定
上面的
apply plugin: 'com.android.application'
dependencies {}
android {}
这个是不是很眼熟呢?没错就是在每个子project的build.gradle中都有的内容,那么我们现在可以这样操作,将这些配置都放到根project进行配置,然后删除子build.gradle中这三个属性,只要你愿意,在根工程中可以完成子project中的配置(不建议)。
如果所有的project中都需要的配置,为防止我们代码的重复编写,我们通常都在根工程中配置好,而gradle也为我们提供了一个对象的api
//配置当前节点工程和其他subproject的所有project
allprojects(){}
void allprojects(Closure configureClosure);
那么下列代码我们更改为:
project('app') { Project pro ->
//指定输出
apply plugin: 'com.android.application'
//指定组
group 'com.test'
//指定版本号
version '1.0.0-release'
//指定依赖
dependencies {}
android {}
}
project('submodule') { Project pro ->
//指定输出
apply plugin: 'com.android.application'
//指定组
group 'com.test'
//指定版本号
version '1.0.0-release'
//指定依赖
dependencies {}
android {}
}
上面的代码我们指定了相同的几个属性,apply、group、version,那么我们可以抽离出,代码如下:
project('app') { Project pro ->
//指定依赖
dependencies {}
android {}
}
project('submodule') { Project pro ->
//指定依赖
dependencies {}
android {}
}
allprojects {
apply plugin: 'com.android.application'
//指定组
group 'com.test'
//指定版本号
version '1.0.0-release'
}
我们有了对所有工程配置的操作的api属性,那么有没有只有对其子project配置操作的api呢?
别急,你能想到的gradle早就为你准备好了,那么请静静食用吧
//只包含子工程
subprojects { Project pro ->
//库工程 添加上传maven仓库配置
if (pro.plugins.hasPlugin('com.android.library')) {
apply from: '../publishToMaven.gradle'
}
}
本章小结
- 了解project
- project api核心部分(实操),了解projects{}、 allProjects(){}和subProjects(){}之间的区别
当然关于project的学习还未结束,本节只是讲解了project api的部分内容,未完待续……