文題套用了現(xiàn)在系統(tǒng)設計中最火的詞匯之一 —— 模塊化战授,當然下文中的 “模塊化” 只是殺雞用牛刀了页藻,不過在我的理解里大致意思差不多吧。
模塊化設計是指在對一定范圍內(nèi)的不同功能或相同功能不同性能植兰、不同規(guī)格的產(chǎn)品進行功能分析的基礎上份帐,劃分并設計出一系列功能模塊,通過模塊的選擇和組合可以構(gòu)成不同的產(chǎn)品楣导,以滿足市場的不同需求的設計方法废境。 —— WIKI
起源
原來項目的基礎庫和一些基于第三方庫封裝的 UI 控件都是通過 Copy 文件來實現(xiàn)復用的,這算是最原始的一種方式吧筒繁。其實在這之前也考慮過直接用 framework 來打包基礎庫噩凹,但是這兩種方式都存在一些缺點 :
- 代碼更新維護比較困難;
- framework 在 debug 階段比較難調(diào)試 (基礎庫也不能排除 bug )毡咏;
- 代碼的前后兼容不容易確定驮宴;
因此,最近我調(diào)研了一部分這方面東西呕缭,發(fā)現(xiàn) CocoaPods 可以勝任幻赚。當然不少大神也一定嘗試過甚至正在使用這樣的方式來管理自己的項目,希望可以指點一下臊旭。
如果你的項目只需要支持 iOS 8 + ,那么可以考慮去試試 Carthage 箩退。
正文
安裝离熏、使用 CocoaPods
- 安裝/更新 CocoaPods (沒有掛 VPN 的同學可以加上 --verbose 查看進度,不然 Terminal 一直都是黑屏 QAQ )
sudo gem install cocoapods
sudo gem update cocoapods
- 拉取 Spec Repo
pod setup
解釋一個概念戴涝,什么是Spec Repo滋戳?它是所有的Pods的一個索引,也就是一個容器(集合)啥刻,所有公開的Pods都在這個里面奸鸯。實際上就是一個 Git 倉庫 remote 端,當你使用了 Cocoapods可帽,這個倉庫會被 clone 到本地的 ~/.cocoapods/repos 目錄下娄涩,進入到這個文件下可以看到 master 文件夾,就是官方的 Spec Repo 了映跟。當你 pod search 的時候就在 master 這個文件下面查找的蓄拣。
- 為項目建立 Podfile
進入工程目錄,執(zhí)行<code> pod init </code>, 將會生成 Podfile 文件努隙,然后通過編輯這個文件就可以管理依賴庫了球恤。
platform :ios, "7.0"
target "TestPod" do
pod 'SDWebImage', '~> 3.2'
pod 'CocoaLumberjack'
pod 'MyKit', :git => 'git@github.com:demo/MyKit.git'
pod 'RSA', :path => 'libs/Sources/RSA'
end
具體的配置參數(shù)可以參見官方文檔 。
- 安裝/更新依賴庫
pod install // 安裝依賴庫荸镊,如存在 Podfile.lock 文件咽斧,則安裝里面的版本
pod update // 更新依賴庫堪置,會將依賴庫更新到最新版本,并更新 Podfile.lock
pod install --no-repo-update // 不更新本地 Spec 源张惹,直接 clone 依賴庫
pod update --no-repo-update
這兩個命令有一定的區(qū)別舀锨,具體可以自行 Google。
安裝完之后就可以通過 .xcworkspace 文件來打開你的工程诵叁。
建立私有 Spec Repo
新建一個 Git 庫
可以使用 Github雁竞、Coding、GitLab 等創(chuàng)建一個 Git 庫作為私有 Pods 庫的 Spec 源拧额。將私有 Spec Repo 添加到本地 repo 目錄
pod repo add SpecRepoName git@github.com/demo/PrivatePods.git
創(chuàng)建私有庫
- 建立 Pods 開發(fā)工程
pod lib create YourPodsLibName
按提示進行配置選擇碑诉,然后打開項目,工程目錄如下:
Podspec Metadata 中的 .podspec 文件是這個私有庫的配置文件侥锦,可以進行編譯配置进栽。以下是我目前用到的一些配置參數(shù)(Ruby):
Pod::Spec.new do |s|
s.name = 'PodsRepo'
s.version = '0.1.0'
s.summary = '管理公司項目中通用代碼的 Pods 庫'
s.homepage = 'http://www.demo.com/'
s.license = { :type => 'MIT', :file => 'LICENSE' } # 開源協(xié)議
s.author = { 'KentonYu' => 'demo@163.com' }
s.source = { :git => 'http://172.0.0.0/iOS/DTPodsRepo.git', :tag => s.version.to_s } # Pods 庫的地址
s.ios.deployment_target = '7.0' # Pods 庫支持的系統(tǒng)版本
s.prefix_header_contents = '#import "DTBaseKit.h"' # Pods 庫中需要預編譯的頭文件
# subspec 是 Spec 中的子類
s.subspec 'BaseKit' do |sub|
sub.source_files = 'PodsRepo/BaseKit/*.{h,m}', 'PodsRepo/BaseKit/**/*.{h,m}'
sub.public_header_files = 'PodsRepo/BaseKit/*.h', 'PodsRepo/BaseKit/**/*.h'
end
s.subspec 'NetworkingKit' do |sub|
sub.source_files = 'PodsRepo/NetworkingKit/*.{h,m}'
sub.public_header_files = 'PodsRepo/NetworkingKit/*.h'
sub.dependency 'AFNetworking', '~> 3.1.0'
sub.dependency 'PodsRepo/BaseKit' # 可以依賴同一個 Pods 庫中的 subspec
end
# s.resource_bundles = { # 依賴的資源路徑
# 'PodsRepo' => ['PodsRepo/Assets/*.png']
# }
# s.frameworks = 'UIKit', 'MapKit' # 依賴的系統(tǒng)庫
end
這一部分的詳細介紹可以 看這里 。
注意:在你像 Pods 目錄中的 Development Pods 里添加文件后恭垦,需要執(zhí)行下 <code>pod install</code>快毛,才能在 Example 工程中被識別出來。
- 驗證是否能通過編譯
pod lib lint // Pods 能否成功編譯
pod lib lint --allow-warnings // 允許警告
通過驗證后番挺,就可以將 Pods 庫 Push 到 Git 上唠帝,并打上 tag (對應 .podspec 中的 version )。
- 驗證 .podspec
pod spec lint
pod spec lint --allow-warnings //同 pod lib lint
這一步會從 Spec 中指定的 s.source 和 s.version 拉取 Git 中的代碼進行編譯玄柏。
- Push 到私有 Spec 源
pod repo push YourPodSpecName Name.podspec
- 測試私有庫
使用 <code>pod search</code> , 能不能查詢到自己 Pods襟衰,可以那就進入下一步。
創(chuàng)建一個 demo粪摘,podfile 設置如下
source 'https://github.com/CocoaPods/Specs.git' #官方倉庫地址
source ‘https://github.com/demo/PodSpec.git’ #私有倉庫地址
# use_frameworks! # 引入 swift 庫時需要
target 'TestPodDemo' do
pod ‘YourPod’, '~> 0.1.0'
end
執(zhí)行 <code>pod install</code> 瀑晒;
小結(jié)
在調(diào)研這個過程中,遇到了很多問題徘意,不過大多數(shù)都可以通過 Google 或者 Github Issue 里找到答案缘回。
利用 CocoaPods 我們可以將項目中的基礎庫奏寨,公有庫抽離出來蒜埋,通過 Pods 來管理挖藏,方便復用的同時,增強代碼的可維護性邑退。
最后我建立了一個私有 Pods 庫竹宋,通過 subspec 進行基礎庫的“模塊化”。
如有不對望指正地技,給個喜歡以示支持蜈七。