Gradle Repo:一个能管理多个Git仓库,又能快速切换分支的Gradle插件

背景和问题

项目组件化过程中,会根据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模块,并模块间的依赖关系。
  • 切换至指定分支。

使用方式

  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配置清单。例如:

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仓库操作。

常见问题

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


 是的,插件会自动include模块。

怎么切换到其他Feature分支?


 只需修改一下repo.xml project 中的branch,然后同步一下即可。
 注意!修改前确保代码已经commit或stash。尽量不要使用Android Studio右下角那个Git分支管理工具。

结语

项目已经上传至GIthub,可直接clone体验一下,打开时会自动clone其他两个模块。

欢迎star交流,Github 项目地址:https://github.com/EastWoodYang/Gradle-Repo

6 声望
3 粉丝
0 条评论
推荐阅读
Android模块接口服务,暴露SDK+接口服务查找(类似微信.api)
MIS - 模块接口服务(Module Interface Service) 模块A对外暴露SDK(接口+数据Model),在运行时,通过接口将对应的接口服务注册到服务容器中。 模块B引用模块A对外暴露的SDK,通过SDK中的接口在服务容器中查找...

EastWoodYang阅读 2.9k

程序员英语学习指南
动机为什么程序员要学习英语?工作:我们每天接触的代码都是英文的、包括很多技术文档也是英文的学习:最新最前沿的技术最开始都是只有English版本就业:学好英语让你的就业范围扩大到全球,而不只限于国内目标读...

九旬6阅读 612

安卓逆向之破解某成人APP播放次数限制
某成人水果APP非VIP用户存在播放次数限制,每天只能播放3次。超过3次需要购买VIP。 由于过于贫穷,于是抽空,对其安卓APP进行了逆向分析,最终成功破解了其播放次数限制。

悖论3阅读 1.2k评论 3

封面图
这一次,解决Flutter Dialog的各种痛点!
4.0版本做了重大调整,迁移请参照: SmartDialog 3.x 迁移 4.0本文内容已更新,文中内容及其代码皆为4.0用法前言Q:你一生中闻过最臭的东西,是什么?A:我那早已腐烂的梦。兄弟萌!!!我又来了!这次,我能自信...

小呆呆6661阅读 3.4k

封面图
uni-app中安卓包检查更新、新版本下载、下载进度条显示功能实现
如果想要做一个app的话,可以有很多种选择方案,uni-app是其中的一个性价比高一些(坑多一些)的方案。本文记录一下,uni-app打安卓包以后,需要检查并下载更新,且显示进度条的功能。

水冗水孚2阅读 721

Flutter 让你的Dialog脱胎换骨吧!(Attach,Dialog,Loading,Toast)
4.0版本做了重大调整,迁移请参照: SmartDialog 3.x 迁移 4.0本文内容已更新,文中内容及其代码皆为4.0用法前言Q:你一生中闻过最臭的东西,是什么?A:我那早已腐烂的梦。兄弟萌!!!我又来了!这次,我能自信...

小呆呆6662阅读 2.3k

封面图
2022 年终总结|致敬即将过去的,匆忙而又虐心的一年...
本文参与了 SegmentFault 思否年度征文「一名技术人的 2022」,欢迎正在阅读的你也加入。 时间,总是过的这么快,快得让人猝不及防,眨眼又是一年的末...似乎儿时的文章中,对于时间的流逝,描述的最多的便是:白...

贺biubiu1阅读 1.3k

封面图
6 声望
3 粉丝
宣传栏