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

背景和問題

項目組件化過程當中,會根據App框架、業務狀況劃分出各個獨立的模塊。一般把各個模塊的代碼管理分開,各自有獨立Git倉庫。 這樣有個好處是能夠按需clone部分模塊的代碼,再組裝成一個可運行的工程。好比,業務組的同窗開發某個Feature的時候,只需clone業務層部分模塊的代碼,不須要中間層、基礎層方面的模塊代碼(業務層模塊引用中間層、基礎層模塊打包上傳Maven的aar)。html

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

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

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

根項目和各模塊

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

介紹 Gradle Repo

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

主要作了三件事情:框架

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

使用方式

  1. 分別在根項目settings.gradlebuild.gradle引用gradle-repo對應的插件ide

    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配置清單。例如:工具

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倉庫的模塊。gradle

  • 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…

相關文章
相關標籤/搜索