1 需求不断插入
1.1问题描述:
一般而言,面临需要做组件化的团队,大概率是一个持续迭代的需求的过程,这过程不可避免会遇到业务需求的插入,如何保证即完成业务需求,又实现组件化进程,这是一个需要综合考量的课题。
1.2 问题解决
由于需求和迭代与组件化是并行的,因此需要对组件化定义里程碑,每个里程碑对应响应的迭代班车,简而言之,例如:每个月迭代一个版本,组件化可以以月为单位,1~x个月为一个里程碑,每个里程碑跟上一个迭代版本,这样保证班车能带上迭代的业务需求,也能带上组件化里程碑的变更,同时记得同步项目其他团队、例如产品团队、Leader(如有必要)、测试团队(一定要)
2 多人协作问题
2.1 背景
一般而言,面临需要做组件化的团队,大概率不会只有1个开发人员(因为一个只有1个开发人员的项目和团队应该规模也不大,对组件化的需求不高),而会是一个至少中小型,那就可能面临需求与组件化的多人同步进行,需要经历阶段性代码合并,由于组件化是对框架改动较大的工程(需要不止移动类到Pod仓库,还有改名,增删类等),这就存在分支合并的频繁冲突
2.2 解决
2.2.1分支管理
2.2.1.1 主工程
常规需求迭代遵循gitflow分支管理,与之并行一个组件化分支,假设为 feature/modulization,如果feature有触发自动merge操作,为了不频繁解决冲突,可以考虑自行定义一个分支名(personal/xxx/modulization),在每次发布版本,合并完dev与master,并打完Tag之后,从release分支合并代码到modulization
由于组件化分支的主工程会频繁涉及到类的增删、类名修改,会引起project.pbxproj 文件大面积的变动,因此合并代码时,可能存在project.pbxproj 文件大量冲突
这里提供一个解决思路:
如果距离上次merge主工程框架变动较大时,可以考虑以modulization分支的project.pbxproj的版本来解决冲突,根据编译报错/或者事先记录下新增文件再进行逐一修复
2.2.1.2 组件库
由于modulization工程依赖的组件需要频繁的修改,因此频繁的打tag显得也不是特别必要,而且组件库的tag还必须经过严格管理,以保证常规进展的需求不受影响。
这里提供一个解决思路:
针对所有进展中的组件库新建分支:moduleModulization,在Podfile依赖时指定:
1
2
3
4
5
6
7
8
pod 'PSCDebugModule' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCDebugModule.git' , :configurations => ['Debug', 'DailyBuild', 'TFInner'], :branch => 'master'
pod 'PSCCommonUI' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCCommonUI.git', :branch => 'master'
pod 'PSCFrameWork' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCFrameWork.git', :branch => 'master'
pod 'PSCLogModule' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCLogModule.git', :branch => 'master'
pod 'PSCAbility' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCAbility.git', :branch => 'master'
pod 'PSCResource' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCResource.git', :branch => 'master'
pod 'PSCLogModule' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCLogModule.git', :branch => 'master'
pod 'PSCBaseModule' , :git => 'ssh://PSC-devops.psc.com:30022/PSC/PSC-ios/Pods/Private/PSCBaseModule.git', :branch => 'master'
同时在Podfile_local(Podfile_local可以参见 imy-bin)配置
1
2
3
4
5
6
7
8
9
10
11
12
13
plugin 'cocoapods-imy-bin'
target 'PSCEvogoiOS' do
pod 'PSCAbility', :path => '../../../../../CocoaPods/Private/PSCAbility'
pod 'PSCDebugModule', :path => '../../../../../CocoaPods/Private/PSCDebugModule'
pod 'PSCBaseModule', :path => '../../../../../CocoaPods/Private/PSCBaseModule'
pod 'PSCCommonUI', :path => '../../../../../CocoaPods/Private/PSCCommonUI'
pod 'PSCFrameWork', :path => '../../../../../CocoaPods/Private/PSCFrameWork'
pod 'PSCLogModule', :path => '../../../../../CocoaPods/Private/PSCLogModule'
pod 'PSCResource', :path => '../../../../../CocoaPods/Private/PSCResource'
pod 'PSCHybridModule', :path => '../../../../../CocoaPods/Private/PSCHybridModule'
pod 'PSCThirdPartyModule', :path => '../../../../../CocoaPods/Private/PSCThirdPartyModule'
end
在本地构建时,可以使用:
1
bdpod bin install
流水线构建时,可恢复分支依赖如下:
1
bdpod install --repo-update
2.2.2 分支合并
分支合并时需要解决的冲突很多,一般存在下面几种情况:
2.2.2.1 代码冲突
常规的冲突,以常规的方式解决,这边不多赘述。一般可以采用sourcetree,进行可视化操作。
2.2.2.2 project.pbxproj冲突
冲突不多时,也可以采用常规方式解决,如果冲突较多,解决的成本太高,可以参考上述:2.2.1.1 建议的方式进行
2.2.2.3 文件冲突
文件冲突一般体现在:某个文件从主工程被迁移到组件库中or类名发生了变化,而其他分支上的修改者改动了这个文件,就会出现文件冲突,这个时候就需要对比组件库中或者新命名的类与冲突文件的变化。
这里提供一个解决思路:使用filemerge(Xcode自带)进行比较
1
/Applications/Xcode.app/Contents/Applications/FileMerge.app