0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_78858299 来源:小余的自习室 作者:小余的自习室 2023-03-30 11:01 次阅读

前言:

前面我们使用两篇文章讲解了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的使用

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

    关注

    8

    文章

    632

    浏览量

    29124
  • project
    +关注

    关注

    0

    文章

    35

    浏览量

    13270
  • gradle
    +关注

    关注

    0

    文章

    26

    浏览量

    695
收藏 人收藏

    评论

    相关推荐

    Gradle版本目录功能的简单应用

    版本帝 Gradle 最新版本已经到了 8.1.1 ,你是不是还在用着 Gradle 3 的功能?今天我们了解一下 Gradle 7.0 之后推出的新功能 Version Catalog 版本目录
    的头像 发表于 09-30 11:12 1240次阅读

    gradle安装与配置unity

    Gradle是一种用于构建和自动化构建过程的强大工具,而Unity则是一款跨平台的游戏引擎。在Unity项目中使用Gradle可以帮助我们更方便地管理和构建项目,同时能够提供更高的自定义能力和稳定性
    的头像 发表于 12-07 14:48 1988次阅读

    Android Studio与Gradle深入

    小语言规范用来处理一个特定的事情(大多情况下是配置)。Android 的插件的 DSL 文档在 Android Gradle DSL有说明。  理解了以上基础之后,你就会知其然,知其所以然了。  以上知识
    发表于 08-31 17:58

    Gradle for Android

    Gradle for Android
    发表于 07-16 15:50

    请问OpenHarmony鸿蒙demo gradle报错怎么解决?

    [build_d4wwgdfsrmyu3wivei5s3deyo$_run_closure1@1db3e190] on root project 'HarmonyAPP' of type org.gradle.api.Project.Open File
    发表于 04-01 11:27

    DevEco Studio自动配置gradle的方法分享

    方法①在项目右键 Find in Path输入gradle-5.4.1-all.zip方法②下载gradle-5.4.1-all.zip解压至不要含有中文名称的目录比如我解压后的路径是D
    发表于 06-09 10:26

    快速入门Gradle的方法

    我们前面的Gradle是一门基于Groov的DSL,可能很多童鞋就是因为你是这个Gradle的迷,第一觉得Gradle是一门独立的语言呀,如果想进入歧途了,我一开始也是这么迷糊的,当你了解之后,你就可以这么理解
    的头像 发表于 04-08 10:56 1270次阅读
    快速<b class='flag-5'>入门</b><b class='flag-5'>Gradle</b>的方法

    Gradle入门知识Gradle详解

    大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.
    的头像 发表于 03-30 10:47 2486次阅读
    <b class='flag-5'>Gradle</b><b class='flag-5'>入门</b><b class='flag-5'>知识</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>详解

    Gradle入门知识Gradle详解(下)

    大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.
    的头像 发表于 03-30 10:51 822次阅读
    <b class='flag-5'>Gradle</b><b class='flag-5'>入门</b><b class='flag-5'>知识</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>详解(下)

    Gradle入门知识Gradle语法1

    很多开发喜欢把`Gradle`简单定义为一种构建工具,和`ant,maven`等作用类似, 诚然Gradle确实是用来做构建,但是如果简单得把Gradle拿来做构建,就太小看Gradle
    的头像 发表于 03-30 10:54 971次阅读
    <b class='flag-5'>Gradle</b><b class='flag-5'>入门</b><b class='flag-5'>知识</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>语法1

    Gradle入门知识Gradle语法2

    很多开发喜欢把`Gradle`简单定义为一种构建工具,和`ant,maven`等作用类似, 诚然Gradle确实是用来做构建,但是如果简单得把Gradle拿来做构建,就太小看Gradle
    的头像 发表于 03-30 10:54 707次阅读

    Gradle入门知识Gradle api解析(下)

    由于Project源码篇幅太长:这里只列出类的部分方法和属性: 我们前面分析过,每个build.gradle对应一个Project,Project在初始过程中会被构建为`树`形结构:
    的头像 发表于 03-30 11:05 1018次阅读

    Gradle Plugin和AGP的区别1

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`Gradle`构建过程中使用的插件的总称,而`Android Gradle Plugin`是这
    的头像 发表于 03-30 11:48 1184次阅读
    <b class='flag-5'>Gradle</b> Plugin和AGP的区别1

    Gradle Plugin和AGP的区别2

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`Gradle`构建过程中使用的插件的总称,而`Android Gradle Plugin`是这
    的头像 发表于 03-30 11:49 1133次阅读

    Gradle Plugin和AGP的区别3

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`Gradle`构建过程中使用的插件的总称,而`Android Gradle Plugin`是这
    的头像 发表于 03-30 11:50 1219次阅读