CocoaPods 項目 “模塊化” 實戰(zhàn)

文題套用了現(xiàn)在系統(tǒng)設計中最火的詞匯之一 —— 模塊化战授,當然下文中的 “模塊化” 只是殺雞用牛刀了页藻,不過在我的理解里大致意思差不多吧。

模塊化設計是指在對一定范圍內(nèi)的不同功能或相同功能不同性能植兰、不同規(guī)格的產(chǎn)品進行功能分析的基礎上份帐,劃分并設計出一系列功能模塊,通過模塊的選擇和組合可以構(gòu)成不同的產(chǎn)品楣导,以滿足市場的不同需求的設計方法废境。 —— WIKI

起源

原來項目的基礎庫和一些基于第三方庫封裝的 UI 控件都是通過 Copy 文件來實現(xiàn)復用的,這算是最原始的一種方式吧筒繁。其實在這之前也考慮過直接用 framework 來打包基礎庫噩凹,但是這兩種方式都存在一些缺點 :

  1. 代碼更新維護比較困難;
  2. framework 在 debug 階段比較難調(diào)試 (基礎庫也不能排除 bug )毡咏;
  3. 代碼的前后兼容不容易確定驮宴;

因此,最近我調(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

按提示進行配置選擇碑诉,然后打開項目,工程目錄如下:

Image1.png

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 進行基礎庫的“模塊化”。

如有不對望指正地技,給個喜歡以示支持蜈七。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市莫矗,隨后出現(xiàn)的幾起案子飒硅,更是在濱河造成了極大的恐慌砂缩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件三娩,死亡現(xiàn)場離奇詭異庵芭,居然都是意外死亡,警方通過查閱死者的電腦和手機雀监,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門双吆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人会前,你說我怎么就攤上這事好乐。” “怎么了瓦宜?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵蔚万,是天一觀的道長。 經(jīng)常有香客問我临庇,道長反璃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任假夺,我火速辦了婚禮淮蜈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘已卷。我一直安慰自己礁芦,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布悼尾。 她就那樣靜靜地躺著,像睡著了一般肖方。 火紅的嫁衣襯著肌膚如雪闺魏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天俯画,我揣著相機與錄音析桥,去河邊找鬼。 笑死艰垂,一個胖子當著我的面吹牛泡仗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猜憎,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼娩怎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胰柑?” 一聲冷哼從身側(cè)響起截亦,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤爬泥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崩瓤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袍啡,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年却桶,在試婚紗的時候發(fā)現(xiàn)自己被綠了境输。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡颖系,死狀恐怖嗅剖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情集晚,我是刑警寧澤窗悯,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站偷拔,受9級特大地震影響蒋院,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜莲绰,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一欺旧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛤签,春花似錦辞友、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戳晌,卻和暖如春鲫尊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沦偎。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工疫向, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豪嚎。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓搔驼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侈询。 傳聞我的和親對象是個殘疾皇子舌涨,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容