【Gradle系列】Gradle 之Project详解(一)

引言

上一阶段,我们了解了Gradle的生命周期

知道了有这么一个过程:Gradle开始于初始化Project,然后到配置形成task的拓扑图,再到根据拓扑图执行一个个task

这阶段,我们将学习Gradle模块中的Project相关知识

概念

Project(工程)在Gradle中,是一个比较重要的概念,是Gradle整个API的入口

下面是一个demo的工程目录如下:

程序员视角的工程和模块.png

在我们程序员的视角中,会认为“DaviPlu”是工程,“app”和“lifecycle-plugin”是模块

但是在Gradle视角中,却是不一样的,“DaviPlu”,“app”和“lifecycle-plugin”都会认为是工程( Project ),具体如下图(执行 “./gradlew projects” 后):

查看多少个project图.png
我们可以看到,执行了“ ./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插件.."
}
复制代码

结尾

哈哈,该篇就写到这里(一起体系化学习,一起成长)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享