大家好,我系苍王。
以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表
这一节的内容是Git的组件化部署
建立工程后,如果你是个单人开发项目的大牛,我佩服你,可以跳过这里,然后愉快写你的代码。
但是如果你需要将组件化项目部署为多人开发,并需要使用到Git部署,那么这编文章希望能成为你的刚需。
这里介绍的是完全可以搭建出一个多人的组件化的研发框架。
优势在于
1.用文件系统将代码隔离。
2.可以功能模块独立编译,并且最终聚合编译。
3.可以自由组合自己需要的模块。
4.编译速度加快。
还有更多的妙用会在之后的章节介绍。
Gank里面新开了一个Sub的分支(https://github.com/cangwang/Gank/tree/sub),欢迎star一波
一.安装git
我一直以来其实只用傻瓜式的git界面工具,将代码放到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,也可以扫码进群。我在这里期待你们的加入!!!