谈及组件化其实网上也有不少文章了,但我个人认为不结合工程管理去单讲组件化恐怕很难让人理解概念,而去实践的时候也只是照猫画虎。
工程管理
组件化的实现很重要的一个组成部分应该是工程拆分,这里我的方案是采取git管理项目pod管理依赖很常见很普通的方法。
理想的状态每一个模块都是独立的,可以单独拿出来测试,发布,也就是每一个子模块其实都是一个git仓库,这里紧接着就是子仓库和主项目的关系问题,上边说到了git和pod,还有一个submodule我喜欢用这个来做子仓库的管理上边为啥没提它呢?
因为submodule本身就是git自带的就是git的一部分,常用命令有1
2
3
4
5
6
7
8
9# 添加子仓库
git submodule add 仓库地址 路径
#初始化所有子仓库
git submodule init
# 更新子仓库
git submodule update
# 也可以初始化更新一起
git submodule update --init
pod只是帮我把依赖关系理清直接本地pod,因为坑爹的开发阶段难免有互相block的情况,那边东西弄完了,但还没有做发布还不稳定,但另一边已经急着要看一眼整体调用的效果了。。。
当然这时候也可以让对面先打个beta的tag,那样可想而知最后会有多少没用的tag,另一方面就是bug联调恢复节点排查的时候,另一方估计只有一个方案就是回滚上一个tag中间哪的问题一点点打tag联调。
上边说的打tag也只是个例子,当然你可以改Podfile对应不同branch,但那也是要每次调都要改一下的,但我这种模式由于是本地pod所以podfile不用动了每次都去指向对应的项目,剩下的就是对子仓库随意切换branch甚至commit节点都可以,调ok了直接commit一下submodule指向的更改即可。然后另一方更新一下再pod update把依赖关系重新建立一下(如果没有添加或删除,甚至这步都不需要,本地pod引用目录我们submodule的本地文件夹里面有什么变化这边自动会变,添加删除是因为依赖关系发生变化了所以跟着需要重新建立),当然理想情况回头有空单独整合一套submodule和pod的命令,submodule更新时判断有增删操作执行pod update其他情况不处理。
这里紧接着就是公共库的处理以及怎么去建立主仓库与子仓库的依赖,我这里把基本思路给出,具体情况还是自己再改动,这里首先就是建立podspec来提供依赖建立1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Pod::Spec.new do |s|
s.name = 'MainWorkSpaceDemo'
s.version = '1.0.0'
s.summary = 'A new container controller to slide '
s.homepage = 'github.com'
s.license = { :type => 'MIT', :file => 'README.md' }
s.author = { 'heroims' => 'heroims@163.com' }
s.source = { :git => '', :tag => "#{s.version}" }
s.platform = :ios, '5.0'
s.source_files = 'ZYQRouter/*.{h,m}'
s.requires_arc = true
#公共仓库
s.subspec 'BaseTool' do |ss|
ss.source_files = 'ZYQRouter/*.{h,m}'
end
#模块1
s.subspec 'Module1' do |sss|
sss.source_files = 'Module1/Module1Lib/*.{h,m}'
end
#模块2
s.subspec 'Module2' do |ssss|
ssss.source_files = 'Module2/Module2Lib/*.{h,m}'
end
end
看见上边相比就明白了把,开发的时候最好要作为模块给人的东西放在一个目录下,当然不放也可以,这里就是为了方便
然后就是引用了,下面是module1工程的,只引用了一个公共库,真正开发的时候则会引用很多,然后build测试模块的app给测试,提供给主仓库的东西放在事先约定的目录下,其他的随便看心情,反正对别人没影响就是自己爽不爽1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18target 'Module1' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for Module1
pod 'MainWorkSpaceDemo/BaseTool', :path => '../MainWorkSpaceDemo.podspec'
target 'Module1Tests' do
inherit! :search_paths
# Pods for testing
end
target 'Module1UITests' do
inherit! :search_paths
# Pods for testing
end
end
more >>