Gradle Repo:一個能管理多個Git倉庫,又能快速切換分支的Gradle外掛

EastWoodYang發表於2018-07-05

背景和問題

專案元件化過程中,會根據App框架、業務情況劃分出各個獨立的模組。通常把各個模組的程式碼管理分開,各自有獨立Git倉庫。 這樣有個好處是可以按需clone部分模組的程式碼,再組裝成一個可執行的工程。比如,業務組的同學開發某個Feature的時候,只需clone業務層部分模組的程式碼,不需要中間層、基礎層方面的模組程式碼(業務層模組引用中間層、基礎層模組打包上傳Maven的aar)。

但在實際操作中產生的問題:

  • 建立建立工程初期,怎麼方便的clone各個Git倉庫 ?手動一個一個clone顯然不合適。

  • 在工程目錄結構中,各模組勢必會處在根專案中,怎麼避免在提交根專案時把各模組也提交了?使用 git submodule ?

根專案和各模組

  • 如何從Feature A分支切換到Feature B分支 ?Android Studio 提供了Common branch的切換功能。但不同分支對應的模組不一時,是無法順利切換過去的。

Gradle Repo:一個能管理多個Git倉庫,又能快速切換分支的Gradle外掛

介紹 Gradle Repo

Gradle Repo是基於Gradle寫的一個外掛,用於管理多個Git倉庫,支援方便快捷的切換分支。在根專案中會有一份配置清單repo.xml,用於描述模組來源、工程結構以及依賴關係。

主要做了三件事情:

  • 從各個遠端倉庫clone程式碼到指定目錄路徑下。通過Git的exclude而不是submodule。
  • 動態include模組,並模組間的依賴關係。
  • 切換至指定分支。

使用方式

  1. 分別在根專案settings.gradlebuild.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'
    複製程式碼
  2. 在根專案下建立一個repo.xml配置清單。例如:

    Gradle Repo:一個能管理多個Git倉庫,又能快速切換分支的Gradle外掛

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倉庫URL
  • branch: 分支名稱

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倉庫操作。

Gradle Repo:一個能管理多個Git倉庫,又能快速切換分支的Gradle外掛

Gradle Repo:一個能管理多個Git倉庫,又能快速切換分支的Gradle外掛

常見問題

是不是不需要在settings.gradle中include模組了 ?

 是的,外掛會自動include模組。
複製程式碼

怎麼切換到其他Feature分支?

 只需修改一下repo.xml project 中的branch,然後同步一下即可。
 注意!修改前確保程式碼已經commit或stash。儘量不要使用Android Studio右下角那個Git分支管理工具。
複製程式碼

結語

專案已經上傳至GIthub,可直接clone體驗一下,開啟時會自動clone其他兩個模組。

歡迎star交流,Github 專案地址:github.com/EastWoodYan…

相關文章