我们平时开发的时候,经常要引用其他库,组件,有的时候是我们自己的,有时候别的项目组的,有时候是第三方的。放在我们自己项目里的组件模块最好修改,我分一个文件夹就隔离了,大一点的分一个Module,甚至封装一个jar,需要资源的话,使用aar,放到maven服务器上,再甚者可以放到jcenter上,直接远端依赖,但也有一些问题,aar不够灵活,每次修改都需要打包上传aar,而且涉及到snapshot和正式包的管理,比较麻烦,本地module虽然足够灵活,却不能很方便的给他人使用,那么有没有一款可以折中的思路呢?这种情况不妨考虑git submodule
只要项目使用git管理,就可以集成git submodule,相当于在项目里集成了另一套独立的git项目,甚至可以再次套娃,不过不推荐多层嵌套git submodeule,多层套娃只会让管理更加混乱,下面简单介绍一下如何使用
首先创建一个空的项目:为了方便管理submodule,推荐创建一个空文件夹,例子里叫submodules
之后再创建一个子工程,并上传到远端git服务器
回到主工程的根目录,将子工程下载并绑定
git submodule add https://github.com/******/BaseSubModule.git submodules
这里 git submodule add 指的是添加submodule,后面第一个参数跟的是子工程的git地址,第二个是添加的位置,这里放到刚才创建的submodules文件,如果有多个submodule可以再创建一个目录进行区分管理
下载完成之后,就能看到一个新的项目
每次更新只需要执行git submodule foreach git pull,更新所有submodule代码即可,环境就搭建完成了,之后看看一些细节
上文提到了,git submodule是一个单独的git项目,因此代码的分支管理并不跟随主项目分支切换而切换,子项目切换分支,需要cd到对应的目录,手动切换(如下图),在实际开发中,并不推荐子项目创建分支,一个master分支即可,不然会造成管理上的混乱
关于修改更新,子项目因为本来也是一个单独的项目,修改时直接打开即可,修改到远端之后,直接push到远端,切换到主工程再pull下来即可,需要注意的是,下次主工程push代码的时候,对应的submodule hash也会变化,如果只是为了更新submodule代码,也会单独产生一条git提交记录
submodule更新频繁的时候,会产生很多额外的提交记录(算是一个缺点)
另外要注意,一些打包平台是否支持此种方式,而且他们每次拉取git submodule代码的时候,是否使用了你提交的submodules,还是取的submodule最新的代码,忽略了你的提交记录,我本人曾经就碰到过基础架构组使用的后者方式进行打包,导致代码不正确的情况
最后简单讲一下submodule的使用吧,虽然代码已经下载并绑定到本地工程了,但是默认是不能调用的,需要做一点简单的配置
先看.gitmodules文件,这个是添加submodule时默认生成的,里面配置了项目的地址,后续更改地址直接修改即可
我们首先要修改setting,注意projectDir地址要带上我们刚才创建的文件夹
之后在build.gradle里添加应用即可使用submodule里的代码资源
要引用多个项目也类似
总的来说,git submodule算是比aar更轻量的解决方案,省去了上传和版本号管理的麻烦,除了要注意打包平台之外,整体体验是不错的,尤其是一个模块频繁更新迭代,而外部又有多个项目依赖时,可以作为一种比较合理的方案尝试
网友评论