背景
pods repo倉(cāng)庫(kù)是同事下載到本地的集惋,有次開(kāi)發(fā)需要升級(jí)阿里云視頻sdk,但是網(wǎng)絡(luò)不太好瓶佳,pod repo update 總失敗芋膘,專(zhuān)門(mén)升級(jí)個(gè)別庫(kù)也有問(wèn)題鳞青,去pods repo 庫(kù) 執(zhí)行g(shù)it pull 也無(wú)用霸饲,所以,重新下載pods repo倉(cāng)庫(kù)到本地
手動(dòng)下載pods repo 庫(kù)的方法
- 1.訪問(wèn)
https://github.com/CocoaPods/Specs臂拓,然后將Specs項(xiàng)目fork到自己的github賬戶上
2.下載GitHub Desktop, 然后clone Specs項(xiàng)目厚脉。
3.將clone的Specs項(xiàng)目的文件夾改名為master,然后拖到/Users/用戶名/.cocoapods/repos目錄下胶惰。
4.運(yùn)行pod setup
解釋?zhuān)簆od setup的本質(zhì)就是將https://github.com/CocoaPods/Specs上的Specs項(xiàng)目clone到/Users/用戶名/.cocoapods/repos目錄下傻工。若此目錄下已有Specs項(xiàng)目,則會(huì)將項(xiàng)目更新到最新的狀態(tài)孵滞。由于Specs很大中捆,容易導(dǎo)致pod setup失敗。這時(shí)就需要我們手動(dòng)安裝Specs坊饶。若直接從github上下載zip文件泄伪,由于缺少git文件,會(huì)導(dǎo)致cocoa pods不使用匿级。若用git clone蟋滴,由于文件過(guò)大染厅,容易導(dǎo)致失敗。但是使用GitHub Desktop軟件津函,則會(huì)提高clone的成功率肖粮,并且會(huì)給出clone的進(jìn)度。
關(guān)于podfile 和 podfile.lock 中 庫(kù)的版本問(wèn)題
一直使用新的版本
//不用指定版本
pod 'SSZipArchive'
指定版本
pod 'SSZipArchive'
其他版本的原理
'> 0.1' 高于0.1的任何版本
'>= 0.1' 版本0.1或更高版本
'< 0.1' 低于0.1的任何版本
'<= 0.1' 版本0.1或更低的版本
除了邏輯運(yùn)算符尔苦,還有一種運(yùn)算符:
'~> 0.1.2' 版本0.1.2和0.2版本之間的任意版本,不包括0.2和比0.2更高的版本
'~> 0.1' 版本0.1和版本1.0之間的任意版本,不包括1.0和比1.0更高的版本
'~> 0' 版本0或比版本0更高的版本,這基本上和不指定版本號(hào)的效果是一樣的涩馆。
- 舉例
pod 'AFNetworking' //不顯式指定依賴庫(kù)版本,表示每次都獲取最新版本
pod 'AFNetworking', '2.0' //只使用2.0版本
pod 'AFNetworking', '> 2.0' //使用高于2.0的版本
pod 'AFNetworking', '>= 2.0' //使用大于或等于2.0的版本
pod 'AFNetworking', '< 2.0' //使用小于2.0的版本
pod 'AFNetworking', '<= 2.0' //使用小于或等于2.0的版本
pod 'AFNetworking', '~> 0.1.2' //使用大于等于0.1.2但小于0.2的版本
pod 'AFNetworking', '~>0.1' //使用大于等于0.1但小于1.0的版本
pod 'AFNetworking', '~>0' //高于0的版本蕉堰,寫(xiě)這個(gè)限制和什么都不寫(xiě)是一個(gè)效果凌净,都表示使用最新版本
使用本地文件夾內(nèi)的一個(gè)庫(kù)
前提是本地的庫(kù)是可供pods管理的,也就是該庫(kù)中要有xxx.podspec
然后執(zhí)行pod install后 本地的庫(kù)會(huì)管理在pods - Development pods 下
關(guān)于pods中相關(guān)文件
Podfile
CocoaPods是用ruby實(shí)現(xiàn)的屋讶,因此Podfile文件的語(yǔ)法就是ruby的語(yǔ)法冰寻。
podfile是一個(gè)說(shuō)明文件,用以描述管理一個(gè)或者多個(gè)Xcode project的target的依賴庫(kù)皿渗。這個(gè)文件應(yīng)該且必須被命名為Podfile
podspec文件
后綴名為podspec(cocoapods specification)的文件是cocoapods的說(shuō)明文件斩芭,該文件為Pods依賴庫(kù)的描述文件,每個(gè)Pods依賴庫(kù)必須有且僅有那么一個(gè)描述文件乐疆。該文件包括依賴庫(kù)的名字划乖、版本、描述挤土、license琴庵、author、source仰美、platform等信息迷殿。
Podfile.lock
這是 CocoaPods 創(chuàng)建的最重要的文件之一。它記錄了需要被安裝的 pod 的每個(gè)已安裝的版本咖杂。如果你想知道已安裝的 pod 是哪個(gè)版本庆寺,可以查看這個(gè)文件。推薦將 Podfile.lock 文件加入到版本控制中诉字,這有助于整個(gè)團(tuán)隊(duì)的一致性懦尝。Objc中國(guó)
Podfile.lock文件最大得用處在于多人開(kāi)發(fā)。當(dāng)團(tuán)隊(duì)中的某個(gè)人執(zhí)行完pod install命令后壤圃,生成的Podfile.lock文件就記錄下了當(dāng)時(shí)最新Pods依賴庫(kù)的版本陵霉,這時(shí)團(tuán)隊(duì)中的其它人check下來(lái)這份包含Podfile.lock文件的工程以后,再去執(zhí)行pod install命令時(shí)伍绳,獲取下來(lái)的Pods依賴庫(kù)的版本就和最開(kāi)始用戶獲取到的版本一致踊挠。如果沒(méi)有Podfile.lock文件,后續(xù)所有用戶執(zhí)行pod install命令都會(huì)獲取最新版本的依賴庫(kù)墨叛,這就有可能造成同一個(gè)團(tuán)隊(duì)使用的依賴庫(kù)版本不一致止毕,這對(duì)團(tuán)隊(duì)協(xié)作來(lái)說(shuō)絕對(duì)是個(gè)災(zāi)難模蜡!在這種情況下,如果團(tuán)隊(duì)想使用當(dāng)前最新版本的依賴庫(kù)扁凛,有兩種方案:
1.更改Podfile忍疾,使其指向最新版本的依賴庫(kù);
2.執(zhí)行pod update命令谨朝;
當(dāng)執(zhí)行pod install 命令時(shí)卤妒,首先會(huì)根據(jù)Podfile文件指定的內(nèi)容,安裝依賴庫(kù)字币,如果有Podfile.lock文件而且對(duì)應(yīng)的Podfile文件未被修改则披,則會(huì)根據(jù)Podfile.lock文件指定的版本安裝。
每次更新了Podfile文件時(shí)洗出,都需要重新執(zhí)行pod install命令士复,以便重新安裝Pods依賴庫(kù)。
當(dāng)執(zhí)行pod update命令時(shí)翩活,如果Podfile中指定的依賴庫(kù)版本不是寫(xiě)死的阱洪,當(dāng)對(duì)應(yīng)的依賴庫(kù)有了更新,無(wú)論有沒(méi)有Podfile.lock文件菠镇,都會(huì)去獲取Podfile文件描述的允許獲取到的最新依賴庫(kù)版本冗荸。
關(guān)于pods一些命令原理
pod repo update
先說(shuō)一下pod官方庫(kù)
終端 cd ~/.cocoapods/repos/
進(jìn)入該文件夾下可以發(fā)現(xiàn)一個(gè)master/文件夾,繼續(xù)進(jìn)Specs/,會(huì)發(fā)現(xiàn)很多很多以數(shù)字命名的文件夾利耍,這里其實(shí)就是官方管理所有pod庫(kù)的一個(gè)資源庫(kù)蚌本,如果一直cd,進(jìn)到最底層隘梨,會(huì)發(fā)現(xiàn)其實(shí)到最后是每一個(gè)庫(kù)的.podspec.json程癌,這里涉及到.podspec是一個(gè)什么東西,以及關(guān)于pod庫(kù)的制作出嘹,可以自行查閱資料席楚。
我們平時(shí)開(kāi)發(fā)pod update或者pod install , 這里其實(shí) pod的工作就是根據(jù)pod庫(kù)名在master/Specs/中找到對(duì)應(yīng)的庫(kù)咬崔,若指定版本則找到指定版本的podspec,否則找最高版本的podspec税稼,找到后根據(jù)podsepc文件中的配置下載指定的庫(kù)資源。
那么pod repo update 的工作就是更新pod資源目錄垮斯,也就是master下的資源郎仆,簡(jiǎn)單說(shuō) 如果有一個(gè)第三方庫(kù)發(fā)布了一個(gè)最新的版本,如果你不執(zhí)行pod repo update兜蠕,那么你的本地是不會(huì)知道有一個(gè)最新版本的扰肌,還會(huì)一直以你本地的資源目錄為準(zhǔn)。那么你永遠(yuǎn)都拿不到這個(gè)庫(kù)的最新版本熊杨。
可能有些人會(huì)問(wèn)了曙旭,我平時(shí)從來(lái)不會(huì)用pod repo update也可以拿到最新的庫(kù)盗舰,那是因?yàn)樵谑褂胮od update是默認(rèn)會(huì)執(zhí)行一遍pod repo update ,所以會(huì)發(fā)現(xiàn)如果你的pod庫(kù)引用多了桂躏,每次pod update都很慢钻趋,網(wǎng)絡(luò)如果不好更是經(jīng)常會(huì)斷掉,就是因?yàn)槟阍诟聀od時(shí)剂习,也更新了資源目錄
pod update 工作流程 :
先拉取遠(yuǎn)程最新目錄蛮位,再根據(jù)目錄中的資源重新更新一遍pod
如果你的podfile中每個(gè)庫(kù)都指定了版本還好,如果沒(méi)有鳞绕,那么每次都是拉一遍最新庫(kù)失仁, 這時(shí)候就要用到命令
pod update --no-repo-update
這條命令表示只根據(jù)本地目錄更新庫(kù),不需要拉取遠(yuǎn)程
再說(shuō)一下有些時(shí)候會(huì)引用一些私有庫(kù) 们何, pod repo update 會(huì)把 ~/.cocoapods/repos/這個(gè)目錄下所有的資源庫(kù)目錄都更新一遍萄焦,有時(shí)候不想更新master,只想更新某個(gè)具體的私有庫(kù)怎么辦冤竹。楷扬。命令。贴见。烘苹。強(qiáng)大而又實(shí)用
pod repo update ~/.cocoapods/repos/***/
需要更新哪個(gè)就指定哪個(gè)文件夾就可以了
關(guān)于pods中的一些問(wèn)題
cocoaPods was not able to update the master
repo
先刪除全局的緩存:
sudo rm -fr ~/Library/Caches/CocoaPods/
sudo rm -fr ~/.cocoapods/repos/master/
終極大招
sudo rm -fr Pods/
再執(zhí)行
sudo gem install cocoapods
pod setup