【Gradle系列】Gradle 之Project詳解(一)

引言

上一階段,咱們瞭解了Gradle的生命週期android

知道了有這麼一個過程:Gradle開始於初始化Project,而後到配置造成task的拓撲圖,再到根據拓撲圖執行一個個task程序員

這階段,咱們將學習Gradle模塊中的Project相關知識編程

概念

Project(工程)在Gradle中,是一個比較重要的概念,是Gradle整個API的入口markdown

下面是一個demo的工程目錄以下:app

程序員視角的工程和模塊.png

在咱們程序員的視角中,會認爲「DaviPlu」是工程,「app」和「lifecycle-plugin」是模塊post

可是在Gradle視角中,倒是不同的,「DaviPlu」,「app」和「lifecycle-plugin」都會認爲是工程( Project ),具體以下圖(執行 「./gradlew projects」 後):學習

查看多少個project圖.png 咱們能夠看到,執行了「 ./gradlew projects 」 命令後,會把當前的Gradle的Project打印出來,同時能夠注意到,其組織方式是以樹的方式實現的(根project爲「DaviPlu」,其餘爲子project)gradle

每個Project,都會有一個對應的「 build.gradle 」文件對應,咱們的Gradle編程,基本都是在「 build.gradle 」文件中編寫ui

每個子project,都會有一個輸出,好比:「app」是一個應用類型的,那麼輸出的就是apk;「lifecycle-plugin」是一個lib相似的,輸出的就是aar或者jarthis

Project的API家族

Project相關的API相對比較多,可是大體能夠分爲以下幾類:

1)task API

- 對當前project,新增或者修改task的能力
複製代碼

2)屬性 API

- project添加額外屬性的能力
複製代碼

3)Project API

- 操做和管理父project和子project的能力
複製代碼

4)Gradle 生命週期

- 這個上次有學習,具體見:https://juejin.cn/post/6960834289755750408
複製代碼

5)file API

- 和一開始學習groovy基礎知識中的file文件操做不一樣,具體見:https://juejin.cn/post/6959482085509693476#heading-8
    - 主要是操做當前gradle相關的文件爲主
複製代碼

6)其餘

- 相對零散,如:gradle添加依賴/配置/引入外部文件等內容
複製代碼

Project API

主要是:操做和管理父project和子project的能力

每個project,都有一個build.gradle文件,而後該文件編譯的時候,會被編譯爲project的字節碼,因此在build.gradle文件裏面寫的內容,其實就是在project類的內部寫的

假如咱們有這麼一個demo工程,其依賴關係爲:

DaviPlu

  • app
  • lifecycle-plugin

有3個project,那麼就有對應的3個build.gradle文件

接下來咱們分別在這3個build.gradle文件中,進行學習API

1)得到全部的project

代碼(在3個gradle文件中都執行一樣代碼):

this.getAllprojects().eachWithIndex { Project entry, int i ->
        println "【getAllprojects().eachWithIndex-->】遍歷全部的project name : " + entry.name
        println "【getAllprojects().eachWithIndex-->】遍歷全部的project index : " + i
    }
複製代碼

執行結果:

【DaviPlu】

【getAllprojects().eachWithIndex-->】遍歷全部的project name : DaviPlu
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 0
【getAllprojects().eachWithIndex-->】遍歷全部的project name : app
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 1
【getAllprojects().eachWithIndex-->】遍歷全部的project name : lifecycle-plugin
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 2
複製代碼

【app】

【getAllprojects().eachWithIndex-->】遍歷全部的project name : app
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 0
複製代碼

【lifecycle-plugin】

【getAllprojects().eachWithIndex-->】遍歷全部的project name : lifecycle-plugin
【getAllprojects().eachWithIndex-->】遍歷全部的project index : 0
複製代碼

2)得到父project

代碼(在3個gradle文件中都執行一樣代碼):

if (this.getParent() == null) {
        println "我是根project,因此我沒有父project !!! "
    } else {
        println "得到父project : " + this.getParent().name
    }
複製代碼

執行結果:

【DaviPlu】

我是根project,因此我沒有父project !!! 
複製代碼

【app】

得到父project : DaviPlu
複製代碼

【lifecycle-plugin】

得到父project : DaviPlu
複製代碼

3)得到根Project

代碼:
    this.getRootProject().name
複製代碼

4)根Project管理子Project相關API

if (this.getParent() == null) {
        println "我是根project !!! "

        project('app', { Project p ->
            println "根project中操做 : " + p.name
            //這裏其實進到了app中的gradle文件裏面,能夠自由的操做
        })

        project('lifecycle-plugin', { Project p ->
            println "根project中操做 : " + p.name
            //這裏其實進到了app中的gradle文件裏面,能夠自由的操做
        })
}
複製代碼

5)當前結點project配置和全部子project的配置

allprojects {
     println "【allprojects】當前結點project配置和全部子project的配置 --> " + project.name
 }
複製代碼

6)全部子project的配置(不包含當前的project)

subprojects {
   println "【subprojects】全部子project的配置(不包含當前的project) --> " + project.name
}
複製代碼

7)當前project是否存在xx插件

if (project.plugins.hasPlugin('com.android.application')) {
        println "【project.plugins.hasPlugin】當前project存在 application插件.."
}
複製代碼

結尾

哈哈,該篇就寫到這裏(一塊兒體系化學習,一塊兒成長)

相關文章
相關標籤/搜索