當前位置:
首頁 > 最新 > 一篇文章掌握Gradle多項目構建

一篇文章掌握Gradle多項目構建

Android機動車

有態度的Android俱樂部

作者: Leo

本文已獲作者獨家授權發布,轉載請聯繫本公眾號


概述

在使用 Android Studio 作為 IDE 之後,Android 項目就開始使用 Gradle 作為構建腳本,Gradle 的優點就不用我多說了,使用 Groovy 作為開發語言,配合各種 Gradle 插件和 DSL 可以實現多樣化的構建過程。

Gradle 能講的知識點很多,本文主要講的是 Gradle 在多項目構建上提供的一些便捷的功能,希望能給大家一些啟發。


構建腳本:本文所說的構建腳本指的是 Gradle 文件,以 為後綴的文件

項目:在多項目構建中,有根項目和子項目。根項目的稱呼是相對的,以執行 gradle 命令的目錄為根項目,當前目錄的子目錄稱為子項目


首先我們對 Gradle 多項目構建先做下了解,這裡所涉及的知識點大部分來源於參考文檔。


Gradle 提供了在任何構建腳本中訪問任何項目,比如可以使用 來對所有項目進行配置:

這個例子我們對所有項目都創建了一個叫 "hello" 的 task,如果你只是想對當前項目的子項目進行配置:

當然你也可以針對單個項目進行配置:

上面所說的操作可以在任何一個構建腳本上執行,所以你可以選擇統一寫到單獨的構建腳本上,再通過 應用進來。


可能有的同學會問,為什麼上面要用 doLast,可以不用 doLast,直接寫可以嗎?

當前可以,但是執行的時機就不一樣了,doLast 從字面意思來看,表示在最後執行,那麼這個最後指的是什麼之後呢。答案就是項目配置評測(evaluation)之後,簡單來講,當 Gradle 開始執行時,會先從根目錄的 中讀取參與構建的項目,即只有將子項目 才能參與構建,接著 Gradle 會在每個項目的根目錄下讀取 如果存在的話,即 並不是必須的。默認情況下,Gradle 會先讀取根項目的配置,即當你執行 Gradle 命令時所在目錄的項目。接著按字母排序,讀取子項目的配置,當項目配置評測完成之後,再執行對應的 task.doLast。

那有的同學又會問了,那如果直接寫,執行的順序是什麼呢?是在評測之後,doLast 之前嗎?這可能是寫習慣應用程序的同學最常見的誤區了,之前博主也是這麼想的,後來經過同事的點撥,Gradle 是邊讀取邊解釋,有點口語化,但確實如此,回到上面的問題,如果直接寫在 task 的代碼,會在 Gradle 讀取到這一行的時候執行,即可能先於其他還沒評測的項目執行,我們可以通過一個例子來看下:

這是項目的目錄結構:

這裡我們包含了兩個子項目,分別是 和 ,在每個項目的 我們都加上 Log 列印:

接著我們在根項目的 即最外層目錄下,添加一個 task:

記得在根目錄下執行 ,參數 只列印我們的 log,結果如下:

結果是不是和我們想的一樣。接著我們在 sub1 的 中增加以下代碼:

上面我們說到,在任何一個構建腳本中,都可以去配置其他項目,所以我們在 sub1 中往 sub2 添加一個變數,然後在 sub2 中將它列印出來:

執行下:

是不是非常有意思,要記住:Gradle 邊讀取邊解釋,先評測項目配置,再執行相應的 Task.doLast


Gradle 執行時,從當前執行的目錄開始查看項目結構,即當前目錄為根項目,根據目錄下的 去評估子項目的配置,執行相應的 Task,我們同樣來看個例子:

我們在 sub2 目錄下創建一個新的目錄 sub3,其中的 如下:

代碼非常簡單,就是輸出當前根項目的名稱。我們先在最外層的目錄下,執行 輸出如下:

記得將 sub3 到 可以看到當前的根項目名稱即為當前運行的目錄,接著我們切換到 sub2 目錄下執行同樣的命令,輸出如下:


這裡我們所說的執行順序,包括兩個方面,第一是項目的評測順序,第二是各個項目 Task 的執行順序。

上面我們提到了項目評測順序是,先評測根項目,接著按字母順序評測子項目。那我們如果想改變默認順序,又不想修改名稱呢。Gradle 提供了 用於聲明某個項目的評測依賴於其他項目的評測,所以會在依賴項目評測完成之後進行。在上面的例子中,sub1 默認會在 sub2 之前執行,但是如果我們在 sub1 項目中增加如下配置:

執行 輸出如下:

結合我們之前說到的,Gradle 是邊讀取邊解釋的,那麼 在最後輸出就不難理解了。

Gradle 還提供了 聲明子項目先於根項目進行評測。

Task 也是類似的,Gradle 提供了 去聲明某個 Task 依賴於其他 Task,所以會在依賴 Task 執行後執行。使用例子如下:


Gradle 允許任何項目去訪問當前多項目構建中其他項目,雖然這很靈活,但使用不當卻會導致項目耦合程度高。

例如,我們通過會在根項目中使用 或者 進行項目配置注入,但如果我們在子項目中去對其他項目進行配置注入,就會導致項目耦合。同時如果在子項目構建時,去更改其他項目的配置,這同樣也會導致項目耦合,並且這兩個操作都可能會影響到並行模式按需配置的正確性。

為了更好的使用配置注入和其他優化選項,我們應該:

避免在子項目 引用其他子項目,更適合在根項目中進行配置注入

避免在構建時更改其他的項目的配置


在 Java 插件的 task 通常是用於對單個項目進行編譯、測試和應用代碼格式化檢查等等。在多項目中構建中你可能想要將 task 作用於指定範圍內的項目,那麼 和 task 可以幫助你。

接下來的例子都是從官方文檔中翻譯而來的

比如在這個例子中, 項目依賴於 和 項目,同時 項目也依賴於 。

當我們執行 時,輸出可能如下:

可以看到,當我們只執行 項目的 task,同時也會執行其依賴項目 部分的 task,如果我們確定對 項目的修改不會影響 項目,可以使用 選項參數,這個參數可以讓 Gradle 去緩存依賴項目生成的 jars,不重新去編譯依賴項目,現在我們增加 參數,,輸出可能如下:

可以看到 選項起作用了。

如果你剛剛從版本控制工具中更新了 項目依賴的項目,你可能不僅僅想要只執行編譯,可能想要去測試它們,那麼 task 將測試所有依賴項目測試運行時的配置。執行 ,可能輸出如下:

有時候你重構了 的某些代碼,想要測試依賴於 項目的其他項目,那麼可以使用 ,它可以測試編譯依賴指定的項目的所有項目,運行 輸出如下:

最後,如果你在根項目執行的任何 task 都會導致所有項目中存在同名的 task 的執行。


在根項目中聲明的屬性和方法都會繼承到子項目中,這是配置注入的替代方式。而配置注入不支持方法,


並行模式

可以使用 開啟並行模式,這可以減少項目構建時間

按需配置

可以使用 開啟按需配置,這同樣可以減少構建配置時間


在上面的篇幅我們著重講解了 Gradle 對多項目構建的支持,包括跨項目配置,多項目的執行規則和執行順序,配置注入等等。但理論知識畢竟只是紙上談兵,下一篇文章會通過具體的項目配置,來講解實際的使用。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Android機動車 的精彩文章:

Android主流播放器比較

TAG:Android機動車 |