0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Gradle入門知識之Gradle api解析(上)

jf_78858299 ? 來源:小余的自習(xí)室 ? 作者:小余的自習(xí)室 ? 2023-03-30 11:01 ? 次閱讀

前言:

前面我們使用兩篇文章講解了Gradle一些基礎(chǔ)知識和Groovy語法詳解

工欲善其事必先利其器

今天我們來講解下Gradle的Api相關(guān)知識

GradleApi

這里我將Gradle api分為以下五個(gè)部分

  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源碼篇幅太長:這里只列出類的部分方法和屬性:

我們前面分析過,每個(gè)build.gradle對應(yīng)一個(gè)Project,Project在初始過程中會(huì)被構(gòu)建為形結(jié)構(gòu):

如下:

圖片

gradleproject樹.png

每個(gè)Project都有自己的子Project父Project

Gradle給我們提供了一系列對Project的操作:

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

    這個(gè)方法最常見使用場景:就是給我們的項(xiàng)目配置倉庫地址:

//統(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

使用場景列舉 :將所有的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等都可以通過這個(gè)方式在子Project中獲取

  • 5.getParent:獲取父Project實(shí)例
  • 6.findProject:查找Project,需要傳入Project名稱獲取路徑
  • 7.project(String path):定位一個(gè)外部或者內(nèi)部Project。

關(guān)于Project操作的api就在上面了

下面我們來講解關(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訪問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)
//注冊一個(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)識符
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')
}

使用上面的方式通過輸入和輸出的掛接,將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)建過程中并沒有掛接到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基本涵蓋我們對Task的使用

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    629

    瀏覽量

    29074
  • project
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    13258
  • gradle
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    692
收藏 人收藏

    評論

    相關(guān)推薦

    Gradle版本目錄功能的簡單應(yīng)用

    版本帝 Gradle 最新版本已經(jīng)到了 8.1.1 ,你是不是還在用著 Gradle 3 的功能?今天我們了解一下 Gradle 7.0 之后推出的新功能 Version Catalog 版本目錄
    的頭像 發(fā)表于 09-30 11:12 ?1178次閱讀

    gradle安裝與配置unity

    Gradle是一種用于構(gòu)建和自動(dòng)化構(gòu)建過程的強(qiáng)大工具,而Unity則是一款跨平臺的游戲引擎。在Unity項(xiàng)目中使用Gradle可以幫助我們更方便地管理和構(gòu)建項(xiàng)目,同時(shí)能夠提供更高的自定義能力和穩(wěn)定性
    的頭像 發(fā)表于 12-07 14:48 ?1858次閱讀

    Android Studio與Gradle深入

    小語言規(guī)范用來處理一個(gè)特定的事情(大多情況下是配置)。Android 的插件的 DSL 文檔在 Android Gradle DSL有說明?! ±斫饬艘陨匣A(chǔ)之后,你就會(huì)知其然,知其所以然了?! ∫陨?b class='flag-5'>知識
    發(fā)表于 08-31 17:58

    Gradle for Android

    Gradle for Android
    發(fā)表于 07-16 15:50

    請問OpenHarmony鴻蒙demo gradle報(bào)錯(cuò)怎么解決?

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

    DevEco Studio自動(dòng)配置gradle的方法分享

    方法①在項(xiàng)目右鍵 Find in Path輸入gradle-5.4.1-all.zip方法②下載gradle-5.4.1-all.zip解壓至不要含有中文名稱的目錄比如我解壓后的路徑是D
    發(fā)表于 06-09 10:26

    快速入門Gradle的方法

    我們前面的Gradle是一門基于Groov的DSL,可能很多童鞋就是因?yàn)槟闶沁@個(gè)Gradle的迷,第一覺得Gradle是一門獨(dú)立的語言呀,如果想進(jìn)入歧途了,我一開始也是這么迷糊的,當(dāng)你了解之后,你就可以這么理解
    的頭像 發(fā)表于 04-08 10:56 ?1232次閱讀
    快速<b class='flag-5'>入門</b><b class='flag-5'>Gradle</b>的方法

    Gradle入門知識Gradle詳解

    大家回想一下自己第一次接觸`Gradle`是什么時(shí)候? 相信大家也都是和我一樣,在我們打開第一個(gè)AS項(xiàng)目的時(shí)候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:47 ?2456次閱讀
    <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`是什么時(shí)候? 相信大家也都是和我一樣,在我們打開第一個(gè)AS項(xiàng)目的時(shí)候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:51 ?801次閱讀
    <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

    很多開發(fā)喜歡把`Gradle`簡單定義為一種構(gòu)建工具,和`ant,maven`等作用類似, 誠然Gradle確實(shí)是用來做構(gòu)建,但是如果簡單得把Gradle拿來做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?945次閱讀
    <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

    很多開發(fā)喜歡把`Gradle`簡單定義為一種構(gòu)建工具,和`ant,maven`等作用類似, 誠然Gradle確實(shí)是用來做構(gòu)建,但是如果簡單得把Gradle拿來做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?684次閱讀

    Gradle入門知識Gradle api解析(下)

    由于Project源碼篇幅太長:這里只列出類的部分方法和屬性: 我們前面分析過,每個(gè)build.gradle對應(yīng)一個(gè)Project,Project在初始過程中會(huì)被構(gòu)建為`樹`形結(jié)構(gòu):
    的頭像 發(fā)表于 03-30 11:05 ?996次閱讀

    Gradle Plugin和AGP的區(qū)別1

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:48 ?1163次閱讀
    <b class='flag-5'>Gradle</b> Plugin和AGP的區(qū)別1

    Gradle Plugin和AGP的區(qū)別2

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:49 ?1107次閱讀

    Gradle Plugin和AGP的區(qū)別3

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:50 ?1173次閱讀