Nike說:Just Do IT(挨踢)—— 寫在模塊化試運行一周后依啰。
背景
早在去年聚磺,就有所耳聞公司將會實行事業(yè)部的劃分,如今按照公司業(yè)務(wù)的劃分霹粥,iOS開發(fā)的小伙伴大多都被分到對應(yīng)的業(yè)務(wù)事業(yè)部去了兼都,這感覺像是我們處于同一個假部門 旨涝,扯遠了~咳咳咳漂羊。為了更好的支撐公司業(yè)務(wù)的快速發(fā)展和產(chǎn)品迭代驾锰,我們采用了項目組件化的解決方案。從去年開始我們就為組件化之路做了不少前期準備走越,其中不僅僅只是將公用的類抽象成組件椭豫,還包括將業(yè)務(wù)代碼從項目中剝離出來,就先稱它為模塊化吧旨指,模塊化的好處在于可以支持各大業(yè)務(wù)線獨立發(fā)版赏酥,適合趕火車的開發(fā)模式,正是我們團隊現(xiàn)在所走的敏捷開發(fā)路線谆构。
項目組件化
要做模塊化的話裸扶,就要先從組件化開始,把組件進行抽象低淡,封裝做成獨立的Pod庫姓言,以便于維護版本和復(fù)用。等做完了組件化蔗蹋,就開始搞模塊化了何荚。
CocoaPods管理組件
def bigfan_private_pods
#私有組件庫
pod 'BFRefreshHeader', :git => '項目地址'
pod 'BFHTTPManager', :git => '項目地址'
pod 'LKGlobalNavigation', :git => '項目地址'
pod 'BFPhotosPicker', :git => '項目地址'
pod 'BFLocationManager', :git => '項目地址'
pod 'BFNetworkActivityLogger', :git => '項目地址'
pod 'BFPhotosBrowser', :git => '項目地址'
pod 'BFActionSheet', :git => '項目地址'
pod 'BFWebImageHelper', :git => '項目地址'
pod 'BFPhotosPickerManager', :git => '項目地址'
pod 'BFCustomHUD', :git => '項目地址'
pod 'BFPlacePicker', :git => '項目地址'
pod 'BFLogServiceManager', :git => '項目地址'
pod 'BFNavigator', :git => '項目地址'
pod 'BFEmptyDataSet', :git => '項目地址'
pod 'BFQRCode', :git => '項目地址', :commit => '7c0636fecc8a43ea4415e2e996b145d3ec9f9ab4'
pod 'NSObjectSafe', :git => '項目地址'
end
PS:commit可以指定分支上的某一次commit記錄。
業(yè)務(wù)模塊化
簡而言之猪杭,就是把業(yè)務(wù)代碼從主項目里剝離出來餐塘,用Pod做成一個單獨的庫來管理。模塊化的要求是:業(yè)務(wù)模塊代碼可以在殼工程加平臺模塊上獨立運行皂吮,當(dāng)然我們還要求殼工程在沒有導(dǎo)入任何業(yè)務(wù)模塊也能獨運行起來戒傻,所以業(yè)務(wù)解耦是多么得重要税手。剛才說到模塊化第一步是組件化,走完第一步后需纳,模塊化過程中我們遇到了不少問題芦倒,包括業(yè)務(wù)之間的解耦和數(shù)據(jù)共享,業(yè)務(wù)模塊之間的相互依賴和調(diào)用不翩。之后引入了DataCenter這個組件來解決業(yè)務(wù)之間的耦合和數(shù)據(jù)共享兵扬。以后有機會會詳細介紹一下DataCenter的原理。
CocoaPods管理模塊組件
def bigfan_pods
bigfan_thirdparty_pods
bigfan_local_pods
bigfan_private_pods
# s.dependencys for test
# 平臺模塊組件 當(dāng)前使用的是遠程倉庫的Crust庫代碼
pod 'Crust', :git => '項目地址', :branch => 'feature/3.0'
#業(yè)務(wù)模塊組件
pod 'Match', :git => '項目地址', :branch => 'feature/3.0'
pod 'TalentC', :git => '項目地址', :branch => 'feature/3.0'
pod 'Stadium', :git => '項目地址', :branch => 'feature/3.0'
pod 'Club', :git => '項目地址', :branch => 'feature/3.0'
end
PS:branch可以指定某個分支上的代碼口蝠。
如何開發(fā)
只要將‘pod 'Crust', :git => '項目地址', :branch => 'feature/3.0'’修改成‘ pod 'Crust', :path => '/Users/maxwellpro/Crust'’后Pod install器钟,這樣就直接將平臺模塊指向我本地的Crust庫,等我開發(fā)完成就直接提交Crust庫的代碼妙蔗,不會影其他業(yè)務(wù)模塊的代碼傲霸。
# s.dependencys for test
# 平臺模塊組件 當(dāng)前使用的是本地倉庫的Crust庫代碼
pod 'Crust', :path => '/Users/maxwellpro/Crust'
PS:假設(shè)我是平臺組的,我只能修改平臺(Crust)模塊的代碼眉反,不能修改Match昙啄、TalentC、Stadium禁漓、Club這四大業(yè)務(wù)模塊的代碼跟衅,即使我修改了,最終也是沒有權(quán)限提交的播歼。
DataCenter
業(yè)務(wù)模塊的數(shù)據(jù)源(DataSource)在App啟動時,就向DataCenter主動注冊業(yè)務(wù)模塊可以提供哪些服務(wù)掰读,當(dāng)業(yè)務(wù)模塊A需要獲取業(yè)務(wù)模塊B數(shù)據(jù)的時候秘狞,業(yè)務(wù)模塊A向DataCenter發(fā)起請求,DataCenter在服務(wù)列表中找到業(yè)務(wù)模塊B注冊的服務(wù)DataSourceB玻蝌,DataSourceB執(zhí)行事先寫好的服務(wù)赴精,數(shù)據(jù)返回給業(yè)務(wù)模塊A帽揪,就實現(xiàn)了業(yè)務(wù)之間的數(shù)據(jù)傳遞和方法調(diào)用。現(xiàn)在的DataCenter還不夠強大减响,暫時還不能實現(xiàn)共享View。
優(yōu)點
- 獨立開發(fā)模式
- 獨立業(yè)務(wù)
- 獨立項目
業(yè)務(wù)線:
- 使用平臺組提供的殼工程+平臺基礎(chǔ)服務(wù)進行開發(fā)郭怪。
- 不能提交殼工程代碼支示。
- 單個業(yè)務(wù)線可以在殼工程上獨立運行。
- 不能直接依賴其他業(yè)務(wù)鄙才。
平臺組:
- 不能提交業(yè)務(wù)代碼颂鸿。
- 不能直接調(diào)用業(yè)務(wù)代碼。
- 業(yè)務(wù)解耦和獨立運行攒庵。
異常流
- Not Found ‘xx’ File - Pod install
- Can't open Pods.xcodeproj - Pod install后重啟Xcode
- Conflicts: BigFan/Pods/Pods.xcodeproj/project.pbxproj - Pod install
- Pod install 報錯 - Pod repo update
存在的問題
目前在試運行的時候發(fā)現(xiàn)CocoaPods的緩存機制會導(dǎo)致代碼可能不是最新的嘴纺。
關(guān)于Pod 庫改成了本地路徑pod install 后還在 pods 文件來下面的解決方法败晴。
- 原因:CocoaPods 緩存引起的
解決方法:
- 1 先在Podfile 里面注掉該Pod庫
- 2 Pod install
- 3 然后在Podfile 里面打開該Pod庫
- 4 Pod install