Gradle【從無到有從有到無】【運行Gradle構建】【G7】執行多項目構建

 

1.執行多項目構建

💡Gradle構建緩存可以幫助將多項目構建的構建時間減少多達90%。在此處註冊以參加我們的實時構建緩存培訓課程,以瞭解如何進行。

除非碰巧是一個龐大的整體應用程序,否則只有最小的項目具有單個構建文件和源代碼樹。消化和理解一個項目的過程通常要容易得多,該項目被分爲多個較小的,相互依賴的模塊。但是,“相互依賴”一詞很重要,這就是爲什麼您通常希望通過單個構建將模塊鏈接在一起。

Gradle通過多項目構建來支持此方案。

1.1.多項目構建的結構

此類構建具有各種形狀和大小,但它們確實具有一些共同的特徵:

  • 一個settings.gradle根或文件master的項目目錄

  • 一個build.gradle在根目錄或文件master目錄

  • 具有自己的*.gradle構建文件的子目錄(某些多項目構建可能會省略子項目構建腳本)

settings.gradle文件告訴Gradle項目和子項目的結構。幸運的是,您不必僅通過學習該文件即可瞭解該項目的結構,因爲您可以運行命令 gradle projects。這是在Gradle示例中的Java 多項目構建中使用該命令的輸出:

示例:列出構建中的項目

Output of gradle -q projects

> gradle -q projects

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

Root project 'multiproject'
+--- Project ':api'
+--- Project ':services'
|    +--- Project ':services:shared'
|    \--- Project ':services:webservice'
\--- Project ':shared'

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :api:tasks

這告訴您multiproject具有三個直接子項目:apiservicesshared。然後,services項目具有其自己的子級,sharedwebservice。這些映射到目錄結構,因此很容易找到它們。例如,你可以找到web服務<root>/services/webservice

默認情況下,Gradle使用找到的目錄settings.gradle名稱作爲根項目的名稱。這通常不會引起問題,因爲所有開發人員在處理項目時都簽出相同的目錄名稱。在Continuous Integration服務器上,例如Jenkins,目錄名稱可能會自動生成,並且與VCS中的名稱不匹配。因此,建議即使在單個項目構建中,也始終將根項目名稱設置爲可預測的名稱。您可以通過設置來配置根項目名稱rootProject.name

每個項目通常都會有自己的構建文件,但不一定是這種情況。在上面的示例中,服務項目只是其他子項目的容器或分組。相應目錄中沒有構建文件。但是,項目的根項目確實有一個。

build.gradle通常用於在子項目之間共享通用配置,例如,通過對所有子項目應用相同的插件集和依賴項。當最好將所有配置都放在一個位置時,它也可以用於配置單個子項目。這意味着在發現特定子項目的配置方式時,應始終檢查根構建文件。

要記住的另一件事是,可能不會調用構建文件build.gradle。許多項目將在子項目名稱之後命名構建文件,例如api.gradleservices.gradle上一個示例一樣。這種方法在IDE中有很大幫助,因爲很難確定build.gradle要打開的文件有20種。這個小技巧由settings.gradle文件處理,但是作爲構建用戶,您不需要知道如何完成的細節。只需瀏覽子項目目錄,即可找到帶有.gradle後綴的文件。

一旦知道哪些子項目可用,構建用戶的關鍵問題就是如何在項目中執行任務。

1.2.執行多項目構建

從用戶的角度來看,多項目構建仍然是您可以運行的任務的集合。不同之處在於您可能想控制要執行哪個項目的任務。您在這裏有兩個選擇:

  • 轉到與您感興趣的子項目相對應的目錄,然後 gradle <task> 照常執行。

  • 使用任何目錄中的合格任務名稱,儘管通常是從根目錄完成的。例如:gradle :services:webservice:build 將構建webservice子項目及其依賴的任何子項目。

第一種方法類似於單項目用例,但是在多項目構建的情況下,Gradle的工作方式略有不同。該命令gradle testtest在相對於當前工作目錄的所有子項目中執行該任務的任務。因此,如果從根項目目錄運行命令,則將testapisharedservices:sharedservices:webservice中運行。如果從services項目目錄運行命令,則僅在services:sharedservices:webservice中執行任務。

爲了更好地控制執行的內容,請使用限定名稱(提到的第二種方法)。這些路徑與目錄路徑一樣,但是使用 ‘:’ 代替‘/’ 或‘\’。如果路徑以‘:’開頭,則相對於根項目解析路徑。換句話說,前導‘:’代表根項目本身。所有其他冒號都是路徑分隔符。

這種方法適用於任何任務,因此,如果您想知道特定子項目中的tasks任務,只需使用該任務即可,例如gradle :services:webservice:tasks

無論您使用哪種技術來執行任務,Gradle都會負責構建目標依賴的任何子項目。您不必自己擔心項目間的依賴性。如果您對如何配置感興趣,可以稍後在用戶手冊中閱讀有關編寫多項目構建的信息。

最後一件事要注意。使用Gradle包裝器時,第一種方法效果不佳,因爲如果不在項目根目錄中,則必須指定包裝器腳本的路徑。例如,如果您位於webservice子項目目錄中,則必須運行../../gradlew build

作爲構建用戶,這就是您真正需要了解的多項目構建的全部內容。現在,您可以確定一個構建是否是一個多項目構建,並可以發現其結構。最後,您可以在特定子項目中執行任務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章