1. 程式人生 > >Gradle學習(六)——多專案構建

Gradle學習(六)——多專案構建

只有一個的構建檔案和資源層級的通常是很小的專案,很少有一個超大而且還是不可分割的專案。把一個專案拆分成幾個相互依賴的小專案更容易有助於理解,相互依賴很重要,可以通過一次構建過程把多個專案構建起來。在Gradle中,這叫做多專案構建。

多專案構建的結構

多專案構建的結構可以能有多種多樣的層次結構和大小,但是他們有一些共同點:

  • 在專案的root或者master目錄下有個settings.gradle檔案
  • 在專案的root或者master目錄下有個build.gradle檔案
  • 子目錄有各自的*.gradle檔案(有些專案可能直接忽略子專案的構建指令碼)

build.gradle告訴Gradle根專案和子專案是如何組織的,你並不需要讀這個檔案才能瞭解這些。你僅僅需要執行gradle projects

命令,輸出如下:

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'studygradle'
+--- Project ':subdir' - this is a subproject
\--- Project ':tools'
     +--- Project ':tools:client'
     \--- Project ':tools:server'
To see a list of the tasks of a project, run gradle <project-path>:tasks For example, try running gradle :subdir:tasks

輸出指明瞭這個多專案有兩個子專案subdir和tools,tools子專案又有它自己的子專案client和server,這些可以對映到檔案系統的目錄結構,很容易找到client在資料夾studygradle/tools/client。

預設情況下,Gradle會以在settings.gradle找到的目錄的檔名作為子專案的專案名。同一個專案組的所有開發者check out

的都是同樣的目錄,大多數情況下不會出什麼問題。但是在持續整合環境中,比如Jenkins這些目錄可能是自動生成的並不會和版本控制伺服器的目錄一致。這種情況下,你應該設定root工程的名字,即使是單個專案。可以在settings.gradle文章中設定:

rootProject.name='studygradle'

通常每個專案都有它自己的構建檔案,但是事實上也並非如此,比如tools子專案僅僅是其他連個子專案的容器,並不需要構建檔案,在它對應的目錄中並沒有構建檔案,但是root專案最好有自己的構建檔案。

root專案的構建檔案通常用於配置一些在子專案中有共性的配置,比如為所以子專案配置共用的外掛和依賴。root的構建檔案還可以配置單獨的子專案,因為有些配置全部集中在一起可能更容易管理。

有時候構建檔名稱並不一定是build.gradle,這就需要在settings.gradle中配置:

project(':tools:client').buildFileName='client.gradle'

多專案構建

從使用者的視角來看,多專案構建就是一組需要執行的任務集合,不同的一點就是你需要控制去執行哪個專案的任務,這有兩個方法:

  • 進入相應的目錄,執行gradle <task>命令
  • 在隨意一個目錄執行限定的任務名,同城都是root目錄中,比如 gradle :tools:client:build將會執行子專案tools的子專案client的構建任務。

第一種方法和單一專案非常類似,但是多專案下,機制確是不同的,在相應專案中執行任務,將會執行對應子專案名稱相同的任務,比如在root目錄中執行gradle test,那麼所有的子專案也都會執行test任務,如果在tools目錄下執行gradle test,那麼tools的子專案也都會執行test任務

為了更好的控制任務的執行範圍,建議最好使用第二種方法,限定名稱第一個:表示根路徑,其他的:表示分隔符,類似於檔案的分隔符,這種方法可以讓構建非常靈活有效。

無論哪種構建,一個專案被構建,那麼它依賴的其他專案也必定被構建,你不需要擔心這些,你只需要配置專案的依賴關係即可。