背景和問題
專案元件化過程中,會根據App框架、業務情況劃分出各個獨立的模組。通常把各個模組的程式碼管理分開,各自有獨立Git倉庫。 這樣有個好處是可以按需clone部分模組的程式碼,再組裝成一個可執行的工程。比如,業務組的同學開發某個Feature的時候,只需clone業務層部分模組的程式碼,不需要中間層、基礎層方面的模組程式碼(業務層模組引用中間層、基礎層模組打包上傳Maven的aar)。
但在實際操作中產生的問題:
-
建立建立工程初期,怎麼方便的clone各個Git倉庫 ?手動一個一個clone顯然不合適。
-
在工程目錄結構中,各模組勢必會處在根專案中,怎麼避免在提交根專案時把各模組也提交了?使用 git submodule ?
- 如何從Feature A分支切換到Feature B分支 ?Android Studio 提供了Common branch的切換功能。但不同分支對應的模組不一時,是無法順利切換過去的。
介紹 Gradle Repo
Gradle Repo是基於Gradle寫的一個外掛,用於管理多個Git倉庫,支援方便快捷的切換分支。在根專案中會有一份配置清單repo.xml,用於描述模組來源、工程結構以及依賴關係。
主要做了三件事情:
- 從各個遠端倉庫clone程式碼到指定目錄路徑下。通過Git的exclude而不是submodule。
- 動態include模組,並模組間的依賴關係。
- 切換至指定分支。
使用方式
-
分別在根專案settings.gradle和build.gradle引用gradle-repo對應的外掛
settings.gradle: buildscript { ... dependencies { classpath 'com.eastwood.tools.plugins:gradle-repo:1.0.0' } } apply plugin: 'gradle-repo-settings' build.gradle: buildscript { ... dependencies { classpath 'com.eastwood.tools.plugins:gradle-repo:1.0.0' } } apply plugin: 'gradle-repo-build' 複製程式碼
-
在根專案下建立一個repo.xml配置清單。例如:
Repo 配置清單
repo.xml 樣例
<?xml version='1.0' encoding='UTF-8'?>
<manifest>
<project origin="https://github.com/EastWoodYang/gradle-repo.git"
branch="master" >
<include name="mylibrary3"/>
</project>
<module name="app" origin="./gradle-repo-app.git">
<dependencies>
<api name="mylibrary2"/>
<implementation name="mylibrary"/>
<apiDebug name="mylibrary"/>
</dependencies>
</module>
<module name="mylibrary" origin="https://github.com/EastWoodYang/gradle-repo-mylibrary.git"/>
<module name="mylibrary2" origin="./gradle-repo-mylibrary2.git"/>
<module name="mylibrary3" />
</manifest>
複製程式碼
project 節點
必須且只有一個project節點,用於描述根專案。
origin
: 遠端Git倉庫URLbranch
: 分支名稱
module 節點
可以定義多個module節點,每個module表示一個具有獨立Git倉庫的模組。
name
: 模組名稱,目錄名稱需一致且唯一;必須項。local
: 相對於根專案的路徑,clone的路徑為root project / local / name
,預設時路徑為root project / name
。origin
: 模組的遠端Git倉庫URL,支援相對路徑。branch
: 模組分支名稱。預設時,同project節點的branch。
include 節點
是project的子節點,可以定義多個include節點。用於表示哪些模組和根專案同一個git倉庫。
name
: 模組名稱
dependencies 節點
是module的子節點,可以定義多個dependencies節點。僅用於描述模組於模組之間的依賴關係。
其子節點的名稱需和 Gradle Dependency Configurations 中定義的一致。
name
: 模組名稱
Android Studio 外掛 Gradle Repo
方便對repo.xml修改後進行sync和繫結遠端git倉庫操作。
常見問題
是不是不需要在settings.gradle中include模組了 ?
是的,外掛會自動include模組。
複製程式碼
怎麼切換到其他Feature分支?
只需修改一下repo.xml project 中的branch,然後同步一下即可。
注意!修改前確保程式碼已經commit或stash。儘量不要使用Android Studio右下角那個Git分支管理工具。
複製程式碼
結語
專案已經上傳至GIthub,可直接clone體驗一下,開啟時會自動clone其他兩個模組。
歡迎star交流,Github 專案地址:github.com/EastWoodYan…