[Android] Git组件化部署

1,724 阅读7分钟

大家好,我系苍王。

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表


这一节的内容是Git的组件化部署

建立工程后,如果你是个单人开发项目的大牛,我佩服你,可以跳过这里,然后愉快写你的代码。

但是如果你需要将组件化项目部署为多人开发,并需要使用到Git部署,那么这编文章希望能成为你的刚需。

这里介绍的是完全可以搭建出一个多人的组件化的研发框架。

优势在于

1.用文件系统将代码隔离。

2.可以功能模块独立编译,并且最终聚合编译。

3.可以自由组合自己需要的模块。

4.编译速度加快。

还有更多的妙用会在之后的章节介绍。


Gank里面新开了一个Sub的分支(https://github.com/cangwang/Gank/tree/sub),欢迎star一波


一.安装git

我一直以来其实只用傻瓜式的git界面工具,将代码放到GitHub。


GitHub

但是GitHub的UI工具,并不能提供全部的Git的功能,我们需要使用Git Bash来完成我们的操作

然后我们上Git的官网(https://git-scm.com/downloads),下载一个Git


然后安装客户端,注意一定要安装Git Bash


然后一路Next安装就可以了,我们最后再桌面可以看到Git Bash的工具,那就安装完成了。


然后,一些GitHub账号验证和服务器验证的基础,那就需要大家IT服务配置来完成了。这里不做深入介绍


二.创建子模块

这里用我的GitHub作为例子,如果自身有git服务器,如何创建项目目录,应该对你们来说也很容易。

New创建一个项目


填写项目名字,然后按create repsository就可以完成


完成模块创建


然后我们使用Git Bash工具,打开到我们的目录,git命令,如果有用过linux命令,应该没有太大的入门成本


然后我们需要使用命令

git submodule add 你想依赖的module的git地址

例如我的是

git submodule add https://github.com/cangwang/home

那么git将会在我们的Gank文件夹里面,将home里面的内容拷贝下来,并且会创建一个.gitmodules的文件。


我们用记事本打开,将显示里面的引用内容。


然后我们已经引用了home子模块到我们的Gank目录里面了。

然后我们下一步,需要将home以子模块引用的方式提交到GitHub上。

我们工程里如果有子模块,是无法使用GitHub的工具来提交到GitHub上的。提示我们需要用GitShell工具


其实我们用Git Bash工具,也是可以的。

我们使用git commit命令


如果我们git commit的时候,没有填写任何的描述信息是无法提交的,所以一定要注意提交的时候务必要填写。


然后使用git push命令就能完成提交了。


然后我们在GitHub将看到子模块的显示和其他一般的文件夹显示是不同的,然后点进去会跳到我们实际的home的GitHub地址里面。



三.子模块编译。

我们新建一个工程


使用GitHub来下载home子模块的代码到我们的Android 的Home工程里面。


选定目录到Home里面


然后我们就能在工程里,看到home了


然后我们新建一个lib module的代码,然后将基本代码拷贝到home里面


然后将home作为lib module配置到settings.gradle里面


home作为lib module配置完成了。

当然我们会组件化运行的时候,功能模块同样需要依赖于base模块的,那么也是非常简单的,重复以上的操作做一个base模块。


这里因为GitHub工具是同一个电脑是无法clone同一个工程多次,所以需要使用命令git clone可以直接克隆。


然后这个Home工程里面,就可以作为一个单一的功能模块来开发了。

然后我们将home代码提交到GitHub上,提交就是上面介绍过的git commit和git push的命令。

如果我们想要将最新的代码更新到我们的Gank的总工程里面,需要使用命令

git submodule update

这里还有一个深坑的地方,因为这句命令不一定能更新子模块的代码,需要使用下面这一句比较保险,直接从远端或者每个子模块的代码,当然相当于全部重新获取,而不是增量获取。

git submodule update --remote

这时候才能获取到其子模块的最新代码。


三 总工程代码同步

如果你的其他同事,第一次下载带有子模块的工程,会发现子模块是完全没有任何代码的


你需要使用命令来拉取子工程的代码

git submodule update --init --recursive

然而就算你拉取了代码下来,还是无法运行

有可能会提示错误

Plugins Suggestion

Unknown features (Run Configuration[AndroidRunConfigurationType], Facet[android, android-gradle]) covered by disabled plugin detected. Enable plugins... Ignore Unknown Features

这是因为android surport没有被勾选导致的,勾选一下重启AS就可以了

方法:左上角File >> Setting >> Plugins >> 把Android Support勾选上,点击Apply,再点OK,会提示重启,重启完就好了。

最终项目完成全部用子模块分层后



四.注意事项

1.如果你想要完全删除子模块

你需要运行下面两句代码。

git rm -r --cached 子模块名称

rm -rf .git/modules/子模块名称

如果你想完全删除,再重新拉取代码,一定要使用上面两句命令,不然他会拉取缓存中的内容。


2.使用GitHub是没法提交子模块的,你子模块的代码,他会检测到很多子模块文件夹修改内容的,它会提示你只能使用Git shell命令来提交,然而提交的时候,会发现根本检测不到提交新的提交内容。


这样如果你总工程是有很多分支的,例如我的Gank有kotlin,java,sub三个分支,我想切换分支,是无法使用GitHub按钮切换的。

只能使用Git Bash命令行来做

切换的命令

git checkout 分支名字

切换前一定要将其他额外的修改提交了,才能切换成功的。


3.为何我不方便一点直接子项目,直接就是一个Android工程,而现在只是一个lib module的库呢?

其根本是因为Git的机制。

使用git submodule add 地址 的时候,其会检测一定是一整个项目,无法add指定的某个项目中指定的文件夹。

Android studio 和git的相互制约,我们现在只能使用这样的机制开发。


4.子模块中,如果引用的额外的xxx.gradle gradle.properties文件。

(1).代码需要手动提交到总工程

(2).再做一个子模块,然后让总工程中的引用到这个子模块中,其他子模块研发的时引用这个子模块,并且将这些配置文件全部引用这个子模块,那么修改的时候也可以同步。


5.Git子模块的更深入的运用还是查看官网中的介绍(https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97)


五.总结

Android studio 和Git机制的限制,所以现在的开发框架,并非绝对的完善和最优。

如果对Git 子模块更加深入的研究,和更好的部署实践,欢迎提出建议,会尽量完善这个组件化部署的简书文章。


如果找到努力的方向,那就去践行吧。

下一节将会更精彩,敬请期待!!!

群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!