最近公司的項(xiàng)目因?yàn)楣δ茌^多,復(fù)雜度較高,所以打算使用組件化方案去解耦業(yè)務(wù),當(dāng)然組件化方案的考慮有很多,不過(guò)這里我們只談?dòng)肅ocoaPods去管理組件這一塊.
在決定使用CocoaPods去管理組件之前,我的思路歷程是這樣的↓
- 我們?yōu)槭裁词褂肅ocoaPods去管理組件呢?
- 我們?yōu)槭裁匆獎(jiǎng)?chuàng)建Pod私有庫(kù)呢?
- 我們?cè)谟?cocoaPods 去管理組件,還會(huì)遇到一個(gè)問(wèn)題,那就是需不需要把我們的組件封裝成framework?
1. 我們?yōu)槭裁词褂肅ocoaPods去管理組件呢?
CocoaPods組件化開(kāi)發(fā)好處:
- 在CocoaPods中可以通過(guò)podfile很好的配置各個(gè)組件,包括組件的增加和刪除,以及控制某個(gè)組件的版本.使用CocoaPods的原因,很大程度是為了解決大型項(xiàng)目中,代碼管理工具merge代碼導(dǎo)致的沖突.并且可以通過(guò)配置podfile文件,輕松配置項(xiàng)目.
- 每個(gè)組件都是一個(gè)獨(dú)立app,可以獨(dú)立開(kāi)發(fā)、測(cè)試,使得業(yè)務(wù)組件更加獨(dú)立,所有組件可以并行開(kāi)發(fā).下層為上層提供能滿足需求的底層庫(kù),保證上層業(yè)務(wù)層可以正常開(kāi)發(fā).
2. 我們?yōu)槭裁匆獎(jiǎng)?chuàng)建Pod私有庫(kù)呢?
眾所周知, CocoaPods 有兩種庫(kù),公開(kāi)庫(kù)和私有庫(kù),公開(kāi)庫(kù)是所有人都可以通過(guò) pod 把你的代碼集成到自己的項(xiàng)目,而私有庫(kù)只是可以內(nèi)部人員自己使用,而我們并沒(méi)有打算把自己的組件給別人用,所以我們要用Pod私有庫(kù)
3. 我們?cè)谟?cocoaPods 去管理組件,還會(huì)遇到一個(gè)問(wèn)題,那就是需不需要把我們的組件封裝成framework?
封裝成framework有如下好處:
- 保證在開(kāi)發(fā)過(guò)程中,其他的開(kāi)發(fā)人員肯能會(huì)修改我的組件代碼.
在多人開(kāi)發(fā)的情況下,我不能保證其他開(kāi)發(fā)人員不去修改我的組件代碼,如果我更新了我的組件代碼,那工程在升級(jí)組件之后,程序必然會(huì)出現(xiàn)問(wèn)題,如果我封裝成了framework,只在. h 文件中暴露出調(diào)用接口的話,是最安全的.
- 如果以后我們的組件要公布出去,又不想開(kāi)源代碼,只要?jiǎng)?chuàng)建一個(gè)Pod公開(kāi)庫(kù)就可以.
在封裝成framework的情況下,調(diào)用者是看不見(jiàn)接口的內(nèi)部實(shí)現(xiàn)的,保證了代碼的安全性
封裝成framework有如下壞處:
- 不方便調(diào)試,是封裝成framework最不方便的地方,出現(xiàn)一個(gè)小 bug, 我都需要在本地調(diào)試成功之后,打包成framework,然后去更新我的 pod 私有庫(kù).這個(gè)過(guò)程是很麻煩的,無(wú)形增加了開(kāi)發(fā)成本.
封裝成framework的利弊都說(shuō)完了,大家可以根據(jù)自己的實(shí)際情況進(jìn)行選擇.
創(chuàng)建Pod私有庫(kù)
言歸正傳,當(dāng)我們要?jiǎng)?chuàng)建Pod私有庫(kù)時(shí),都需要做什么?
創(chuàng)建工程創(chuàng)建Pod所對(duì)應(yīng)的podspec文件創(chuàng)建私有的Spec Repo本地測(cè)試podspec文件是否可用向私有的Spec Repo中提交podspec測(cè)試Spec Repo中的的 podspec 是否可用私有庫(kù)關(guān)聯(lián)trunk 賬號(hào)
1. 創(chuàng)建工程
因?yàn)?github 的私有庫(kù)是付費(fèi)的,所以我使用碼云的私有倉(cāng)庫(kù).

創(chuàng)建完才想起來(lái)截圖,所以就變成這樣了,大家將就看一下吧
正常添加 License 這里我選擇的是 MIT License
把你的組件代碼上傳到倉(cāng)庫(kù)
我的目錄結(jié)構(gòu)是這樣的

2. 創(chuàng)建Pod所對(duì)應(yīng)的podspec文件
切換到項(xiàng)目目錄下
cd ~/Desktop/foundationcategaries
生成.podspec文件
$ pod spec create FoundationCategaries
FoundationCategaries替換成自己私有庫(kù)的名字,就像SDWebImage.
執(zhí)行完這句換之后,你就多了一個(gè)FoundationCategaries.podspec文件

用 Sublime Text或其他工具 打開(kāi)FoundationCategaries.podspec文件,修改為一下樣式,注意修改完成后,不要有注釋信息.
Pod::Spec.new do |s|
s.name = "FoundationCategaries"
s.version = "0.1"
s.summary = "Just Testing."
s.description = <<-DESC
Testing Private Podspec.
* Markdown format.
* Don't worry about the indent, we strip it!
DESC
s.homepage = "https://git.oschina.net/baozhatou"
s.license = "MIT"
s.author = { "Sean" => "xxxx@xxx.com" }
s.source = { :git => "https://git.oschina.net/xxx/foundationcategaries.git", :tag => "0.1" }
s.platform = :ios, '8.0'
s.requires_arc = true
s.source_files = 'FoundationCategories/FoundationCategories/*.{h,m}', 'FoundationCategories/FoundationCategories/*.{h,m}'
s.frameworks = 'Foundation'
end
修改完成后,把你的代碼和FoundationCategaries.podspec文件提交碼云的倉(cāng)庫(kù).
3. 創(chuàng)建私有的Spec Repo
打開(kāi)你cocopods 倉(cāng)庫(kù)
open ~/.cocoapods/repos/
現(xiàn)在的目錄結(jié)構(gòu)是這樣的

pod repo add FoundationCategories http://git.oschina.net/xxx/foundationcategaries
執(zhí)行成功后你會(huì)發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè)FoundationCategories的文件夾

切換到FoundationCategories路徑下
cd ~/.cocoapods/repos/FoundationCategories/
測(cè)試本地庫(kù)是否正確
pod lib lint
測(cè)試后,發(fā)現(xiàn)問(wèn)題,就去修改,錯(cuò)誤信息一般提示的很明顯,成功后會(huì)提示如下:

4. 本地測(cè)試podspec文件是否可用
我們可以創(chuàng)建一個(gè)新的項(xiàng)目,在這個(gè)項(xiàng)目的Podfile文件中直接指定剛才創(chuàng)建編輯好的podspec文件,看是否可用。 在Podfile中我們可以這樣編輯
platform :ios, '8.0'
pod 'FoundationCategaries', :podspec => '~/.cocoapods/repos/FoundationCategories/FoundationCategaries.podspec' # 指定podspec文件
然后執(zhí)行pod install命令安裝依賴
我這里遇到個(gè)錯(cuò)誤,如下

fatal: Remote branch 0.1 not found in upstream origin
這個(gè)錯(cuò)誤就是沒(méi)有找到碼云倉(cāng)庫(kù)找到我的tag 0.1,所以出錯(cuò).因?yàn)槲覀冊(cè)?code>FoundationCategaries.podspec文件里面指定了tag 0.1
s.source = { :git => "https://git.oschina.net/xxx/foundationcategaries.git", :tag => "0.1" }
cocopods去我們的倉(cāng)庫(kù)找,卻沒(méi)有找到,所以會(huì)報(bào)錯(cuò)
那我們就去打一個(gè)0.1的 tag,讓cocopods找到就可以了

然后執(zhí)行pod install命令安裝依賴

安裝成功.
5. 向私有的Spec Repo中提交podspec
提交之前需要注冊(cè)Cocoapods賬號(hào),如果有請(qǐng)忽略此步驟
pod trunk register xxx@xxx.com ‘snoopy’ --description='write for blog'
注冊(cè)成功,會(huì)給你發(fā)一封驗(yàn)證郵件.

打開(kāi)郵件驗(yàn)證一下就好,如果發(fā)現(xiàn)自己沒(méi)有收到郵件,去垃圾郵件里面找一下,可能被攔截了.
驗(yàn)證之后,執(zhí)行pod trunk me,驗(yàn)證一下是否注冊(cè)成功.
成功后,切換到FoundationCategories目錄下
cd ~/.cocoapods/repos/FoundationCategories/
向私有的Spec Repo中提交podspec
pod repo push FoundationCategories FoundationCategaries.podspec #前面是本地Repo名字 后面是podspec名字
完成之后這個(gè)組件庫(kù)就添加到我們的私有Spec Repo中了.
查找一下
pod search FoundationCategaries

ok
6. 測(cè)試Spec Repo中的的 podspec 是否可用
新建工程測(cè)試一下
在 Podfile 文件中添加FoundationCategaries
pod 'FoundationCategaries', '~> 0.1'
完成之后,說(shuō)明Spec Repo中的的 podspec 可用
7. 私有庫(kù)關(guān)聯(lián)trunk 賬號(hào)
以上建立了本地私有庫(kù),如果更換設(shè)備,還想使用,就要給私有庫(kù)關(guān)聯(lián) trunk 賬號(hào),關(guān)聯(lián)以后,我們以后就可以通過(guò)賬號(hào)管理和維護(hù)我們的私有庫(kù)了
pod trunk push

這樣表示關(guān)聯(lián)成功
這時(shí)候我們看看我們的 trunk賬戶信息

??,關(guān)聯(lián)完畢.
關(guān)于 trunk 的其他操作大家可以訪問(wèn)trunk文檔,里面的內(nèi)容很詳細(xì).
這篇文章我們就講到這里,關(guān)于更新維護(hù)podspec我們會(huì)在下一篇文章詳細(xì)介紹.