Gradle高阶-Project详解1

进行本章节的学习,请按照我提供的方式进行食用效果会更佳哦!

打开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文件中执行。
  1. 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'
    }
}
本章小结
  1. 了解project
  2. project api核心部分(实操),了解projects{}、 allProjects(){}和subProjects(){}之间的区别

当然关于project的学习还未结束,本节只是讲解了project api的部分内容,未完待续……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值