Cocoapods的使用原理
CocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的一個第三方庫的依賴管理工具。利用 CocoaPods凄贩,可以定義自己的依賴關(guān)系 (稱作 pods)晌柬,并且隨著時間的變化宛瞄,以及在整個開發(fā)環(huán)境中對第三方庫的版本管理非常方便。相比于手動導(dǎo)入框架(下載源碼锐峭,導(dǎo)入項目停忿,配置環(huán)境驾讲,添加依賴庫,容易出錯)瞎嬉, 使用Cocoapods只需要簡潔3步就可以引入一個第三方框架蝎毡,一般情況下都不會出錯。
第一步氧枣、終端進(jìn)入項目路徑下沐兵,使用命令pod init
,自動生成Podfile文件便监。
第二步扎谎、使用vim打開Podfile文件碳想,加入你想要使用的開源庫。(比如說AFN, 你可以使用 pod search AFNetworking
查詢AFN的版本毁靶,選擇一個合適的Version胧奔,然后添加 pod 'AFNetworking', '~> Version'
)
第三步、使用命令pod install
安裝预吆。
然后只需等待Cocoapods像魔法一樣幫我們導(dǎo)入第三方框架龙填,你就可以在項目中愉快的使用AFNetworking了。作為一個iOS開發(fā)者拐叉,Cocoapods的便利性相信每一個用過的開發(fā)者都愛不釋手岩遗。
為什么我們僅僅在Podfile中引入框架的名稱和版本,就能下載到位于Github倉庫的框架代碼凤瘦,并導(dǎo)入到我們自己的項目中宿礁?
帶著這個疑問,我們在Finder中進(jìn)入~/.cocoapods/repos
路徑下蔬芥,可以看到repos路徑下有一個master文件夾梆靖,其實這個master文件夾就是我們Cocoapods的開源庫索引文件的本地倉庫。
證實一下笔诵,終端下進(jìn)入master路徑返吻,命令ls -a
,可以看到有.git文件嗤放,我們查看下它的遠(yuǎn)程倉庫思喊,使用命令git remote -v
壁酬,輸出https://github.com/CocoaPods/Specs
次酌,在瀏覽器中打開這個地址,這個就是Cocoapods的遠(yuǎn)程索引倉庫托管地址The CocoaPods Master Repo
舆乔。我們在master目錄中看到很多子文件夾岳服,隨便打開一個,一直找到盡頭希俩,會找到一個*.podspec.json
文件吊宋,這個文件就是一個第三方庫的索引文件,我們打開這個文件颜武,你就會看到相關(guān)的 name璃搜、version、homePage鳞上、git
等等相關(guān)的內(nèi)容这吻,這就是我們使用 pod search * 可以搜到指定的第三方庫的原因。
如果你想更深入的了解Cocoapods的工作原理篙议,可以參考:
ObjC中國 深入理解Cocoapods
Cocoapods 指南
私有倉庫的搭建
根據(jù)上面的摸索唾糯,相信大概知道了Cocoapods的一個工作流程怠硼,那么我們搭建自己的私有倉庫也是采用相同的思路,大概也是這三步:
1移怯、創(chuàng)建自己的私有索引倉庫香璃。
2、創(chuàng)建自己的框架或者項目舟误,將索引文件提交到這個私有索引倉庫葡秒。
3、在需要使用的項目的Podfile文件中嵌溢,導(dǎo)入私有索引倉庫地址同云,即可使用。
Tips: 如果你同時需要使用其他開源框架堵腹,類似AFN等炸站,必須將Cocoapods的索引倉庫地址也導(dǎo)入,否則無法安裝使用AFN疚顷。
Reason:默認(rèn)情況下旱易,不寫source源的時候使用Cocoapods的索引倉庫,而當(dāng)你加入了你的私有索引倉庫地址腿堤,pod就只會在你指定的索引倉庫里面去找阀坏,當(dāng)然是找不到AFN等開源框架的。
看起來好像很簡單笆檀,那開始搭建我們的私有Cocoapods倉庫吧!
準(zhǔn)備工作:
1忌堂、一臺能上網(wǎng)的mac電腦。
2酗洒、一個自己的git賬號士修,什么git倉庫都可以。
Tips: github的私有倉庫好像是收費的樱衷,可以使用gitLab棋嘲、gitee等,我使用gitee
步驟:
1矩桂、在gitee上面創(chuàng)建一個索引倉庫JTSpecs沸移。 (這里為了演示,我就設(shè)置為開源的侄榴,你可以設(shè)置為私有的)
2雹锣、在終端使用命令, 然后我們的
~/.cocoapods/repos
目錄下會多出來一個JTSpecs本地索引倉庫。
$pod repo add JTSpecs https://gitee.com/hjt_830/JTSpecs.git
3癞蚕、終端進(jìn)入到桌面路徑蕊爵,創(chuàng)建本地項目,pod將自動使用模板創(chuàng)建一個項目https://github.com/CocoaPods/pod-template.git
pod lib create JTTest
4涣达、在gitee上創(chuàng)建一個遠(yuǎn)程JTTest倉庫在辆,終端進(jìn)入JTTest的項目路徑下证薇,將項目push到遠(yuǎn)程倉庫。
git remote add origin https://gitee.com/hjt_830/JTTest.git
Tips: 第一次pull項目的時候匆篓,會出現(xiàn)`refusing to merge unrelated histories`, 只需使用 `git pull origin master --allow-unrelated-histories`即可正確拉取浑度,然后push。
5鸦概、進(jìn)入項目路徑下的 JTTest/JTTest/Classes
路徑下箩张,將里面的 ReplaceMe.m
文件替換為自己的文件。
6窗市、XCode中修改 JTTest.podspec
文件先慷。
Tips: 由于這個文件是ruby腳本,為了便于閱讀和修改咨察,我們選中這個它论熙,并在右邊的`Identity and Type`中的Type中,選擇`Ruby Script`類型摄狱,然后隨便選中其他某個文件脓诡,再選回`JTTest.podspec`,XCode可以正確顯示內(nèi)容了
這里面有幾個地方需要注意:
s.public_header_files
是指你要給出的所有公共頭文件的路徑媒役,你可以指定特定的頭文件
s.frameworks
是項目中依賴的系統(tǒng)框架祝谚,比如說 UIKit、Foundation酣衷、CoreData
s.dependency
是指項目中依賴的第三方框架交惯,比如說 AFNetworking,可以指定版本
s.ios.deployment_target
是你的庫需要的最低系統(tǒng)支持版本
...
7穿仪、改完后席爽,我們終端進(jìn)入Example目錄下,執(zhí)行命令pod install
牡借,等待執(zhí)行完成拳昌,你會發(fā)現(xiàn) AFNetworking 已經(jīng)安裝進(jìn)去了。
8钠龙、本地校驗,校驗的是我們的JTTest.podspec文件御铃,所以需要返回上級目錄碴里,執(zhí)行命令 pod lib lint --allow-warnings --verbose
。
不出意外上真,會驗證通過咬腋,如果這里驗證失敗的同學(xué),看一下報錯的原因睡互,通常如果項目本身編譯正確的話根竿,那么就是 *.podspec文件里面的問題陵像,而且每次對 Development Pods
目錄下的文件和 *.podspec
文件做了任何的修改,都必須要再執(zhí)行一次 pod install
命令寇壳,確保Development Pods
目錄下的文件和 *.podspec
里面配置保持一致醒颖。
9、既然驗證通過壳炎,那我們就提交本地代碼泞歉,git push origin master
,然后一定要打標(biāo)簽匿辩,一定要打標(biāo)簽腰耙,一定要打標(biāo)簽,重要的事情說三遍铲球,并且這個標(biāo)簽要和 *.podspec
中的 s.version
的版本保持一致挺庞。
10、最后一步稼病,推送到我們的遠(yuǎn)程索引倉庫挠阁,當(dāng)然,推送之前你可以先遠(yuǎn)程校驗一次溯饵,終端使用命令 pod spec lint --allow-warnings --verbose
侵俗,其實這個校驗也可以不做,因為我們推送的時候也會做這個工作丰刊。下面就推送到遠(yuǎn)程索引倉庫吧隘谣,終端使用命令 pod repo push JTSpecs JTTest.podspec --allow-warnings --verbose
,這里的 JTSpecs
是我們第二步中創(chuàng)建的索引倉庫的名字啄巧,你替換成自己的就好了寻歧。
到這里基本就已經(jīng)完成了私有倉庫的搭建,使用的時候只需要在 Podfile
引入就可以了秩仆,當(dāng)然記得加上:
source https://gitee.com/hjt_830/JTSpecs.git
(這個替換成你自己的私有索引倉庫的地址)
source https://github.com/CocoaPods/Specs
(這個是Cocoapods的開源私有索引倉庫)
大功告成码泛!
當(dāng)然,其實私有倉庫的搭建澄耍,還有更高級的用法噪珊,AFNetworking
中的文件是分不同的目錄,也就是不同的子模塊的齐莲,其實就是用到的 s.subspec
痢站,這個其實也很簡單,需要指定子模塊选酗,具體可以參照AFNetworking阵难,如果有疑問可以提問哦。
下面是我創(chuàng)建的私有倉庫芒填,后面我會把 subspec 也添加上去的:
JTSpecs
JTTest
最后呜叫,喜歡的小伙伴記得點贊收藏哦空繁!??????