Gradle高階-Project詳解1

進行本章節的學習,請按照我提供的方式進行食用效果會更佳哦!android

打開As工程,根據下面的例子練習起來
打開As工程,根據下面的例子練習起來
打開As工程,根據下面的例子練習起來

好了,下面請享用api

project至關於Android中的activity的入口同樣,是構建gradle程序的入口,下面讓咱們來學習一下吧!閉包

瞭解project

在gradle中Android工程中的每個module都是一個project,咱們能夠經過執行gradlew projects來查看,其實執行的project命令就是執行了一個Task任務,天然而然的就執行了gradle的生命週期。
注意:判斷是否是一個gradle的project的關鍵就是是否包含build.gradle文件,若是將build.gradle文件刪除掉,那麼這個目錄就至關於一個普通的文件夾,只不過存放了大量的文件而已。
gradle中的project是經過樹管理結構的方式來管理全部的子project,雖說子project能夠繼續嵌套project,可是常規的寫法中不建議再繼續嵌套,一個子project就是一個輸出。app

project核心api

在瞭解project的api以前,咱們先看下圖,瞭解下project api的組成部分maven

經過此圖,咱們發現project api是由6部分組成,那麼咱們在學習的時候就能夠經過分組的方式進行學習。 咱們按照顏色來區分每一個部分的做用(紫色、綠色、橙色、黃色)
紫色:當前project擁有操做父project和管理子project的能力,管理生命週期的能力
綠色:新增task或者是project使用已有task的能力
橙色:爲project添加額外屬性的能力
黃色;操做該project中的文件的能力

  • project實戰
    請注意:下列代碼操做都必需要build.gradle文件中執行。
  1. project相關API(如下代碼都是在配置階段中執行)
//獲取相關中的全部project,至關於gradlew projects的操做
this.getAllprojects()
複製代碼

下面經過腳本的方式一樣能夠輸出全部的projects內容,等價於getAllprojects方法學習

getProjects()

def getProjects(){
    println '--------------------'
    println 'Root Projects'
    println '--------------------'
    println '--------------------'
    this.getAllprojects().eachWithIndex{ Project project, int i ->
        if (i==0){
            println "Root Projects ':${project.name}'"
        }else {
            println "+--- project ':${project.name}' "
        }
    }
}
複製代碼

想要讓上面的腳本生效,咱們只須要隨便執行一個task便可,好比gradlew clean操做,結果以下:gradle

此時咱們已經獲取到了getProjects方法中的內容
思考:經過腳本的方式如何獲取全部的子project信息,並輸出?(5分鐘思考時間)
好了,僞裝5分鐘過去了,如今宣佈答案:

getSubProjects()

def getSubProjects() {
    println '--------------------'
    println 'Sub Projects'
    println '--------------------'
    println '--------------------'
    this.getAllprojects().eachWithIndex { Project project, int i ->

        println "+--- project ':${project.name}' "
    }

}
複製代碼

今日一練

在每一個module的build.gradle中執行上述代碼,看下會輸出什麼?ui

----------------------------分割線----------------------------
剛纔咱們說了如何獲取子project,如今咱們看下如何獲取到父project,代碼奉上:this

/** * 獲取父project name * @return */
def getParentProject(){
    def name=this.getParent().name
    println "the parent project name is :${name}"
}
複製代碼

今日問答

Q:在每一個build.gradle文件中操做後你會發現,當你在root project(即項目頂層)中的build.gradle執行該方法的時候會報錯,緣由是什麼呢?spa

A:緣由就是它已是頂級容器了,沒有父類了,因此再去獲取它的頂級固然就是不存在了的。

下面咱們再來一個獲取頂級project

/** * 獲取頂級Project name * @return */
def getRootPro(){
    def name=this.getRootProject().name
    println "the parent project name is :${name}"
}

複製代碼

今日問答

Q:爲何getParent獲取的時候會有null的存在,而getRootProject卻不會有null的現象?

A:緣由其實在文章的最開始就已經提到過了,由於project是已樹的形式進行管理,當樹達到根節點的時候,固然就沒有節點了,此時固然就是null了,而getRootProject一直獲取的都是根節點,固然能夠獲取到啦。

上面咱們說過根工程能夠管理咱們全部的子工程,那麼能不能在根工程經過具體的api去配置子工程呢?
注意:如下代碼都在根project中執行

project(){}
源碼解析:
path:要操做子project的路徑
configureClosure:閉包參數,爲指定路徑的project指定參數,閉包的參數就是當前的project
Project project(String path, Closure configureClosure);


project('app') { Project pro ->
    println pro.name
    //指定輸出
    apply plugin: 'com.android.application'
    //指定組
    group 'com.test'
    //指定版本號
    version '1.0.0-release'
    //指定依賴
    dependencies {}
    android {}

}
複製代碼

由於閉包參數是Project,那麼咱們獲取Project的信息進行指定 上面的

apply plugin: 'com.android.application'
dependencies {}
android {}
複製代碼

這個是否是很眼熟呢?沒錯就是在每一個子project的build.gradle中都有的內容,那麼咱們如今能夠這樣操做,將這些配置都放到根project進行配置,而後刪除子build.gradle中這三個屬性,只要你願意,在根工程中能夠完成子project中的配置(不建議)。

若是全部的project中都須要的配置,爲防止咱們代碼的重複編寫,咱們一般都在根工程中配置好,而gradle也爲咱們提供了一個對象的api

//配置當前節點工程和其餘subproject的全部project
allprojects(){}
void allprojects(Closure configureClosure);
複製代碼

那麼下列代碼咱們更改成:

project('app') { Project pro ->

    //指定輸出
    apply plugin: 'com.android.application'
    //指定組
    group 'com.test'
    //指定版本號
    version '1.0.0-release'
    //指定依賴
    dependencies {}
    android {}

}
project('submodule') { Project pro ->

    //指定輸出
    apply plugin: 'com.android.application'
    //指定組
    group 'com.test'
    //指定版本號
    version '1.0.0-release'
    //指定依賴
    dependencies {}
    android {}

}
複製代碼

上面的代碼咱們指定了相同的幾個屬性,apply、group、version,那麼咱們能夠抽離出,代碼以下:

project('app') { Project pro ->
  
   
    //指定依賴
    dependencies {}
    android {}

}
project('submodule') { Project pro ->
   
    //指定依賴
    dependencies {}
    android {}

}

allprojects {
    apply plugin: 'com.android.application'
    //指定組
    group 'com.test'
    //指定版本號
    version '1.0.0-release'
}
複製代碼

咱們有了對全部工程配置的操做的api屬性,那麼有沒有隻有對其子project配置操做的api呢?
別急,你能想到的gradle早就爲你準備好了,那麼請靜靜食用吧

//只包含子工程
subprojects { Project pro ->
    //庫工程 添加上傳maven倉庫配置
    if (pro.plugins.hasPlugin('com.android.library')) {
        apply from: '../publishToMaven.gradle'
    }
}
複製代碼

本章小結

  1. 瞭解project
  2. project api核心部分(實操),瞭解projects{}、 allProjects(){}和subProjects(){}之間的區別

固然關於project的學習還未結束,本節只是講解了project api的部份內容,未完待續……

相關文章
相關標籤/搜索