前言:
前面我们使用两篇文章讲解了Gradle一些基础知识和Groovy语法详解
工欲善其事必先利其器
今天我们来讲解下Gradle的Api
相关知识
Gradle
Api
这里我将Gradle api分为以下五个部分
- 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
,version
,description
等
- 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文章
640浏览量
29200 -
project
+关注
关注
0文章
35浏览量
13296 -
gradle
+关注
关注
0文章
26浏览量
712
发布评论请先 登录
相关推荐
评论