前言:
前面我們使用兩篇文章講解了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文章
648瀏覽量
29301 -
project
+關注
關注
0文章
35瀏覽量
13301 -
gradle
+關注
關注
0文章
26瀏覽量
728
發布評論請先 登錄
相關推薦
評論