Gradle入门知识之Gradle api解析(上)

电子说

1.2w人已加入

描述

前言:

前面我们使用两篇文章讲解了Gradle一些基础知识和Groovy语法详解

工欲善其事必先利其器

今天我们来讲解下Gradle的Api相关知识

GradleApi

这里我将Gradle api分为以下五个部分

  1. Project api :

2.Task api

3.File api

4.Property api

5.其他 api

既然是讲解api,那就首先去他们源码中看看:

笔者使用的是最新版本的:Gradle7.5.1

查看源码方式:

更改:gradle-wrapper.properties文件中的

distributionUrl=https\\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
为:
distributionUrl=https\\://services.gradle.org/distributions/gradle-7.5.1-all.zip

重新编译之后就可以看到我们Gradle的源码了

我们先来看Project部分

1.Project api

由于Project源码篇幅太长:这里只列出类的部分方法和属性:

我们前面分析过,每个build.gradle对应一个Project,Project在初始过程中会被构建为形结构:

如下:

源码

gradleproject树.png

每个Project都有自己的子Project父Project

Gradle给我们提供了一系列对Project的操作:

  • 1.getAllprojects:可以获取工程中的所有Project

    这个方法最常见使用场景:就是给我们的项目配置仓库地址:

//统一配置所有子project的集合
allprojects {
    repositories {
        maven {url "https://maven.aliyun.com/repository/google/"}
        maven {url "https://maven.aliyun.com/repository/public/"}
        mavenCentral()
        maven {
            url uri('D:/maven_local')
        }
    }
    group 'cpm_group'
    version 1.0
}

当然也可以配置所有项目的其他属性:如group,versiondescription

  • 2.getSubprojects:获取所有的子Project

使用场景列举 :将所有的lib模块上传到maven中

//包括子Project
subprojects {Project project ->
    if(plugins.hasPlugin('com.android.library')){
        apply from:'../publishMaven.gradle'
    }
}
  • 3.getProject:获取当前Project实例

我们所有的build.gradle中的代码,都是以当前Project实例为delegate展开的:

在脚本中,你可以使用下面方法调用project方法:

1.this.project
2.project
3.this
4.什么不不写,直接调用方法或者属性

以上方法调用方式结果都是一样的

  • 4.getRootProject:获取root脚本就是我们根工程的Project

获取根Project的用处也很大,我们平时在根工程中定义的一系列变量,task等都可以通过这个方式在子Project中获取

  • 5.getParent:获取父Project实例
  • 6.findProject:查找Project,需要传入Project名称获取路径
  • 7.project(String path):定位一个外部或者内部Project。

关于Project操作的api就在上面了

下面我们来讲解关于Task相关的api

2.Task api

Gradle中整个工程由若干个Project组成,而每个Project由若干个Task组成,

在Gradle中Task由TaskContainer统一管理,工程全局只有一个TaskContainer,project中可以使用tasks访问TaskContainer方法

1.创建

//使用Project的方法创建:

task task1{
    group 'yuhb'
}
task task1(group:'yuhb'){

}

//使用TaskContainer创建:
tasks.create('task1'){
    group 'yuhb'

}

//带任务类型的Task:一般在插件中使用
class MyTestTask extends DefaultTask {

    @TaskAction
    void doActon(){
        //do something
    }
}
tasks.create('task1',MyTestTask.class)
//注册一个task,在必要的时候创建,不是立即创建
tasks.register('task1',MyTestTask.class)

2.查找

//findByName:
def task1 = tasks.findByName('task6'):
//getByName:
def task2 = tasks.getByName('task6')
//两者区别:findByName没有找到返回null,getByName没有找到返回异常UnknownTaskException
//findAll:
Set<Task> taskSet = this.tasks.findAll()
//查找当前TaskContainer中所有的任务
//matching:
tasks.matching {
    group = 'yuhb'
}
//获取匹配某些条件的task

3.删除

Gradle没有提供删除方法,也不需要,因为每个任务都只会执行一次,

如果确切不需要就不要引入这个task即可

4.设置task属性

//创建task的时候传入:
//方法1:在参数中传入
task task2(group:'yuhb',description: 'this is task2'){

}
//方法2:在闭包中传入
tasks.create('task3'){
    group 'yuhb'
    description 'this is task3'
}
//两种方法效果是一样的

Task属性:

属性 描述
name 唯一标识符
group 组别
description 描述信息
type Task类型,默认为 DefaultTask
actions 有哪些动作
dependsOn 依赖的task列表

5.Task依赖管理

5.1:使用dependOn

task task1{
    //单个task
    dependsOn 'task2'
    //多个task使用列表
    dependsOn = ['task2','task3']
}
//这里task1强依赖task2和task3

5.2:使用mustRunAfter

task task1{
    //单个task
    mustRunAfter 'task2'
    //多个task使用列表
    mustRunAfter = ['task2','task3']
}

5.3:使用Task输入和输出

每个task都会有自己的输入和输出:产出数据可能会提供给下一个任务使用

TaskInputs:管理输入

TaskOutputs:管理输出

输入和输出有三种类型:

1.文件,文件夹

2.单个映射属性

3.多个映射属性,Map

task task2(group:'yuhb',description: 'this is task2'){
        inputs.file file('release.xml')
}
task task3(group:'yuhb',description: 'this is task2'){
        outputs.file file('release.xml')
}

使用上面的方式通过输入和输出的挂接,将task2和task3实现依赖关系。

6.Task执行

使用task的doFirst和doLast可以在任务执行前后设置一些Action

task task3(group:'yuhb',description: 'this is task2'){
    outputs.file file('release.xml')
    doFirst {
          'task3执行前'
    }
    doLast {
          'task3执行后'
    }
}

Task执行方式:

1.使用gradlew命令行:如要执行build任务:

gradlew build

2.使用IDE中的Gradle面板

源码

gradle面板.png

3.将task挂接到Gradle生命周期中

我们创建任务后,在执行构建过程中并没有挂接到Gradle生命周期中,也就是不会执行

def prebuild = this.tasks.findByName('prebuild')
prebuild.dependsOn('task1')

上面的例子prebuild是编译前需要执行的一个预编译任务,使用dependsOn依赖关系,将任务task1使用dependsOn挂接到prebuild执行前

关于Task api就讲解到这里,以上api基本涵盖我们对Task的使用

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分