前言:
前面我們使用兩篇文章講解了Gradle一些基礎(chǔ)知識(shí)和Groovy語(yǔ)法詳解
工欲善其事必先利其器
今天我們來(lái)講解下Gradle的Api
相關(guān)知識(shí)
Gradle
Api
這里我將Gradle api分為以下五個(gè)部分
- Project api :
2.Task api
3.File api
4.Property api
5.其他 api
既然是講解api,那就首先去他們?cè)创a中看看:
筆者使用的是最新版本的: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
的源碼了
我們先來(lái)看Project部分
1.Project
api
由于Project源碼篇幅太長(zhǎng):這里只列出類的部分方法和屬性:
我們前面分析過(guò),每個(gè)build.gradle對(duì)應(yīng)一個(gè)Project,Project在初始過(guò)程中會(huì)被構(gòu)建為樹
形結(jié)構(gòu):
如下:
gradleproject樹.png
每個(gè)Project都有自己的子Project
和父Project
Gradle給我們提供了一系列對(duì)Project的操作:
-
1.
getAllprojects
:可以獲取工程中的所有Project這個(gè)方法最常見使用場(chǎng)景:就是給我們的項(xiàng)目配置倉(cāng)庫(kù)地址:
//統(tǒng)一配置所有子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
}
當(dāng)然也可以配置所有項(xiàng)目的其他屬性:如group
,version
,description
等
- 2.
getSubprojects
:獲取所有的子Project
使用場(chǎng)景列舉 :將所有的lib模塊上傳到maven中
//包括子Project
subprojects {Project project ->
if(plugins.hasPlugin('com.android.library')){
apply from:'../publishMaven.gradle'
}
}
- 3.
getProject
:獲取當(dāng)前Project實(shí)例
我們所有的build.gradle中的代碼,都是以當(dāng)前Project實(shí)例為delegate展開的:
在腳本中,你可以使用下面方法調(diào)用project方法:
1.this.project
2.project
3.this
4.什么不不寫,直接調(diào)用方法或者屬性
以上方法調(diào)用方式結(jié)果都是一樣的
- 4.
getRootProject
:獲取root腳本就是我們根工程的Project
獲取根Project的用處也很大,我們平時(shí)在根工程中定義的一系列變量,task等都可以通過(guò)這個(gè)方式在子Project中獲取
- 5.
getParent
:獲取父Project實(shí)例 - 6.
findProject
:查找Project,需要傳入Project名稱獲取路徑 - 7.
project(String path)
:定位一個(gè)外部或者內(nèi)部Project。
關(guān)于Project操作的api就在上面了
下面我們來(lái)講解關(guān)于Task相關(guān)的api
2.Task
api
Gradle中整個(gè)工程由若干個(gè)Project組成,而每個(gè)Project由若干個(gè)Task組成,
在Gradle中Task由TaskContainer
統(tǒng)一管理,工程全局只有一個(gè)TaskContainer
,project中可以使用tasks訪問(wèn)TaskContainer方法
1.創(chuàng)建
//使用Project的方法創(chuàng)建:
task task1{
group 'yuhb'
}
task task1(group:'yuhb'){
}
//使用TaskContainer創(chuàng)建:
tasks.create('task1'){
group 'yuhb'
}
//帶任務(wù)類型的Task:一般在插件中使用
class MyTestTask extends DefaultTask {
@TaskAction
void doActon(){
//do something
}
}
tasks.create('task1',MyTestTask.class)
//注冊(cè)一個(gè)task,在必要的時(shí)候創(chuàng)建,不是立即創(chuàng)建
tasks.register('task1',MyTestTask.class)
2.查找
//findByName:
def task1 = tasks.findByName('task6'):
//getByName:
def task2 = tasks.getByName('task6')
//兩者區(qū)別:findByName沒有找到返回null,getByName沒有找到返回異常UnknownTaskException
//findAll:
Set<Task> taskSet = this.tasks.findAll()
//查找當(dāng)前TaskContainer中所有的任務(wù)
//matching:
tasks.matching {
group = 'yuhb'
}
//獲取匹配某些條件的task
3.刪除
Gradle沒有提供刪除方法,也不需要,因?yàn)槊總€(gè)任務(wù)都只會(huì)執(zhí)行一次,
如果確切不需要就不要引入這個(gè)task即可
4.設(shè)置task屬性
//創(chuàng)建task的時(shí)候傳入:
//方法1:在參數(shù)中傳入
task task2(group:'yuhb',description: 'this is task2'){
}
//方法2:在閉包中傳入
tasks.create('task3'){
group 'yuhb'
description 'this is task3'
}
//兩種方法效果是一樣的
Task屬性:
屬性 | 描述 |
---|---|
name | 唯一標(biāo)識(shí)符 |
group | 組別 |
description | 描述信息 |
type | Task類型,默認(rèn)為 DefaultTask |
actions | 有哪些動(dòng)作 |
dependsOn | 依賴的task列表 |
5.Task依賴管理
5.1:使用dependOn
task task1{
//單個(gè)task
dependsOn 'task2'
//多個(gè)task使用列表
dependsOn = ['task2','task3']
}
//這里task1強(qiáng)依賴task2和task3
5.2:使用mustRunAfter
task task1{
//單個(gè)task
mustRunAfter 'task2'
//多個(gè)task使用列表
mustRunAfter = ['task2','task3']
}
5.3:使用Task輸入和輸出
每個(gè)task都會(huì)有自己的輸入和輸出:產(chǎn)出數(shù)據(jù)可能會(huì)提供給下一個(gè)任務(wù)使用
TaskInputs
:管理輸入
TaskOutputs
:管理輸出
輸入和輸出有三種類型:
1.文件,文件夾
2.單個(gè)映射屬性
3.多個(gè)映射屬性,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')
}
使用上面的方式通過(guò)輸入和輸出的掛接,將task2和task3實(shí)現(xiàn)依賴關(guān)系。
6.Task執(zhí)行
使用task的doFirst和doLast可以在任務(wù)執(zhí)行前后設(shè)置一些Action
task task3(group:'yuhb',description: 'this is task2'){
outputs.file file('release.xml')
doFirst {
'task3執(zhí)行前'
}
doLast {
'task3執(zhí)行后'
}
}
Task執(zhí)行方式:
1.使用gradlew
命令行:如要執(zhí)行build任務(wù):
gradlew build
2.使用IDE
中的Gradle
面板
gradle面板.png
3.將task掛接到Gradle生命周期中
我們創(chuàng)建任務(wù)后,在執(zhí)行構(gòu)建過(guò)程中并沒有掛接到Gradle生命周期中,也就是不會(huì)執(zhí)行
def prebuild = this.tasks.findByName('prebuild')
prebuild.dependsOn('task1')
上面的例子prebuild
是編譯前需要執(zhí)行的一個(gè)預(yù)編譯任務(wù),使用dependsOn
依賴關(guān)系,將任務(wù)task1
使用dependsOn
掛接到prebuild
執(zhí)行前
關(guān)于Task api就講解到這里,以上api基本涵蓋我們對(duì)Task的使用
-
源碼
+關(guān)注
關(guān)注
8文章
665瀏覽量
30041 -
project
+關(guān)注
關(guān)注
0文章
35瀏覽量
13410 -
gradle
+關(guān)注
關(guān)注
0文章
26瀏覽量
815
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Gradle版本目錄功能的簡(jiǎn)單應(yīng)用
gradle安裝與配置unity
Android Studio與Gradle深入
請(qǐng)問(wèn)OpenHarmony鴻蒙demo gradle報(bào)錯(cuò)怎么解決?
DevEco Studio自動(dòng)配置gradle的方法分享
快速入門Gradle的方法

Gradle入門知識(shí)之Gradle詳解

Gradle入門知識(shí)之Gradle詳解(下)

Gradle入門知識(shí)之Gradle語(yǔ)法1

Gradle入門知識(shí)之Gradle語(yǔ)法2
Gradle入門知識(shí)之Gradle api解析(下)
Gradle Plugin和AGP的區(qū)別1

評(píng)論