簡介
Cocoapods是OS X和iOS下的一個(gè)第三方庫管理工具儡司,并且支持Objective-C和swifit語言鸟整。通過Cocoapods為項(xiàng)目添加稱為"Pods"的依賴庫(這些庫必須是Cocoapods所支持的)欠窒,并且輕松實(shí)現(xiàn)第三方庫的版本管理。
引入Cocoapods的意義:Cocoapods在引入第三方庫時(shí)自動(dòng)為我們完成各種配置,包括配置編譯階段燕雁、連接器選項(xiàng)诞丽、甚至是ARC環(huán)境下的-fno-objc-arc配置等;Cocoapods可以很方便的查找第三方庫拐格,可以快速方便的尋找到優(yōu)秀的第三方庫以及它們的各種信息僧免。
原理:CocoaPods的原理是將所有的依賴庫都放到另一個(gè)名為Pods的項(xiàng)目中,然后讓主項(xiàng)目依賴Pods項(xiàng)目捏浊,這樣懂衩,源碼管理工作都從主項(xiàng)目移到了Pods項(xiàng)目中。Pods項(xiàng)目最終會(huì)編譯成一個(gè)名為libPods.a的文件金踪,主項(xiàng)目只需要依賴這個(gè).a文件即可浊洞。
Cocoapods 官方網(wǎng)站:https://cocoapods.org/
Cocoapods整個(gè)項(xiàng)目托管在github上, 所有的Pods依賴庫也都依賴github
https://github.com/CocoaPods
一胡岔、 配置Ruby環(huán)境法希,安裝CocoaPods
CocoaPods是基于ruby ecosystem的,需要ruby環(huán)境靶瘸,使用ruby的gem命令苫亦。所以我們的系統(tǒng)要有ruby環(huán)境。然而Mac系統(tǒng)默認(rèn)會(huì)安裝好ruby環(huán)境怨咪∥萁#可在終端ruby -v查看ruby版本
打開終端,依次執(zhí)行輸入的部分命令如下:
安裝需要用到Ruby诗眨,雖然Mac自帶了Ruby唉匾,不過版本有點(diǎn)老了,最好更新一下辽话。(測試不更新也是可以的)
//查看ruby版本
ruby -v
//輸出信息
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
- 打開終端肄鸽,輸入命令!(部分命令如下)
sudo gem update --system //升級(jí)Ruby環(huán)境*
gem sources -l // 查看源列表
gem sources -remove https://rubygems.org/ // 將不需要的源移除掉
gem sources -a https://gems.ruby-china.com/ // 添加ruby-china源源(當(dāng)然你有其他可用的源也可以)
sudo gem install cocoapods // 安裝cocoapods油啤,需要輸入用戶密碼典徘,輸入完成后,按回車鍵益咬,需要等待許久后才能完成安裝逮诲,成功安裝后會(huì)有提示
pod --version //查看是否安裝成功,如果成功會(huì)顯示pod的版本
pod setup //這條命令是將Github上的開源庫https://github.com/CocoaPods/Specs.git托管的Podspec索引文件都下載到本地 幽告,花費(fèi)時(shí)間比較久梅鹦,
pod search AFNetworking // 搜索AFNetworking庫
sudo gem uninstall cocoapods //卸載CocoaPods
執(zhí)行pod setup ,這條命令是將Github上的開源庫https://github.com/CocoaPods/Specs.git托管的Podspec索引文件都下載到本地的~/.cocoapods/repos/master/路徑下 冗锁,花費(fèi)時(shí)間比較久齐唆,所以可以選擇直接從別的地方拷貝一份放到對(duì)應(yīng)的目錄下,或者手動(dòng)去Github下載冻河,下載完成后放到對(duì)應(yīng)的目錄下箍邮。
- 通過如下終端命令下載到對(duì)應(yīng)的位置茉帅,可以看到下載進(jìn)度。
- 搜索第三方庫
搜索第三方庫如果出現(xiàn)了上述錯(cuò)誤锭弊,可以執(zhí)行
rm ~/Library/Caches/CocoaPods/search_index.json來刪除本地舊的search_index.json文件堪澎,
然后再次輸入pod search AFNetworking進(jìn)行搜索,pod search 命令會(huì)先查看有無search_index.json文件味滞,如果不存在該文件樱蛤,會(huì)自動(dòng)根據(jù)master文件夾生成一個(gè)新的search_index.json文件,
這時(shí)會(huì)提示Creating search index for spec repo 'master'..剑鞍,然后就耐心等待吧.......成功了之后就如下圖:
二昨凡、安裝成功,使用CocoaPods
在使用CocoaPods之后攒暇,我只需要將用到的第三方開源庫放到一個(gè)名為Podfile的文件中土匀,然后執(zhí)行pod install子房。CocoaPods就會(huì)自動(dòng)將這些第三方開源庫的源碼下載下來形用,并且為我的工程設(shè)置好相應(yīng)的系統(tǒng)依賴和編譯參數(shù)。
- 使用時(shí)需要新建一個(gè)名為 Podfile 的配置文件证杭,放在主項(xiàng)目的根目錄下(與TestFramework.xcodeproj文件同一層級(jí))田度,以我桌面上的TestFramework工程為例:
用終端命令新建Podfile文件到主項(xiàng)目目錄(關(guān)于終端命令的使用可以看看這篇Mac 終端命令大全):
① 、 cd到項(xiàng)目總目錄
②解愤、 創(chuàng)建Podfile配置文件
接著第①步镇饺,終端先執(zhí)行vim Podfile命令 ,接著在鍵盤端輸入 i送讲,進(jìn)入編輯模式奸笤,輸入如下配置信息(也可以先跳過輸入這一步,之后直接打開Podfile文件編輯):
編輯相關(guān)介紹
pod 'AFNetworking'
//不顯式指定依賴庫版本哼鬓,表示每次都獲取最新版本
pod 'AFNetworking', '~>0'
//高于0的版本监右,寫這個(gè)限制和什么都不寫是一個(gè)效果,都表示使用最新版本
pod 'AFNetworking', '~> 0.1.2'
//使用大于等于0.1.2但小于0.2的版本
pod 'AFNetworking', '~>0.1'
//使用大于等于0.1但小于1.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', '< 2.0'
//使用小于2.0的版本
pod 'AFNetworking', '<= 2.0'
//使用小于或等于2.0的版本
pod 'AFNetworking', :git => '[http://gitlab.xxxx.com/AFNetworking.git'](https://links.jianshu.com/go?to=http%3A%2F%2Fgitlab.xxxx.com%2FAFNetworking.git%27), :branch => 'R20161010'
//指定分支
pod 'AFNetworking', :path => '../AFNetworking'
//指定本地庫
然后按Esc异希,并且輸入“ :”號(hào)進(jìn)入vim命令模式健盒,然后輸入wq,回車后就會(huì)發(fā)現(xiàn)TestFramework項(xiàng)目目錄中多一個(gè)Podfile文件称簿。
命令執(zhí)行完成后扣癣,需要導(dǎo)入的第三方庫都已經(jīng)下載完成并且設(shè)置好了編譯參數(shù)和依賴,同時(shí)你需要注意:
- 使用 CocoaPods 生成的 CocoapodsDemo.xcworkspace 文件來打開工程憨降,而不是以前的 CocoapodsDemo.xcodeproj 文件父虑;
- 當(dāng)需要更改Podfile文件配置信息時(shí) ,比如刪除或者增加三方庫 授药,直接編輯Podfile文件士嚎, 每次更改了 Podfile 文件后垂涯,你需要重新執(zhí)行一次pod install命令,別忘了要cd 到Podfile文件所在目錄航邢。
- 第三方庫們都有人在維護(hù)升級(jí)耕赘,當(dāng)我們需要更新下第三方庫的版本時(shí),就需要終端執(zhí)行命令pod update膳殷。
podfile文件編輯介紹
- 添加源方式操骡,任選一,推薦使用清華鏡像源
#####1.沒有私有specs赚窃,使用
source 'https://cdn.cocoapods.org/'
#####2.有私有specs册招,使用
source 'https://github.com/artsy/Specs.git'
source 'https://cdn.cocoapods.org/'
##舊版CocoaPods不支持CDN,可能拿到的三方框架不是最新的
source 'https://github.com/CocoaPods/Specs.git'
##推薦使用清華大學(xué)鏡像源
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
##忽略.cocoapods中多個(gè)specs源引起的警告問題
install! 'cocoapods', :warn_for_unused_master_specs_repo => false
- build configurations (編譯配置) 默認(rèn)情況下勒极,依賴項(xiàng)會(huì)被安裝在所有target的build configrations中是掰。
//為了調(diào)試或者其他原因,他們可以在給定的configurations中啟用
pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
//或者辱匿,你可以至指定一個(gè)build configration
pod 'PonyDebugger', :configuration => ‘Debug'
- source: 默認(rèn)被指定的依賴項(xiàng)會(huì)在全局級(jí)別的指定源中匹配搜索键痛。可以為特依賴關(guān)系指定源
//指定特定源中搜索匾七,并忽略任何全局源*
pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
- Subspecs:當(dāng)使用依賴庫名字引入依賴庫時(shí)絮短,也會(huì)默認(rèn)安裝依賴庫中的所有子模塊。
//指定引用指定子模塊
pod 'QueryKit/Attribute’
//指定一個(gè)子模塊集合
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
- pod: 指明項(xiàng)目依賴昨忆,一個(gè)依賴是由一個(gè)pod名稱和一個(gè)可選版本定義
// a. 如果不添加版本號(hào)丁频,pod默認(rèn)使用最新的 如:
pod ’ AFNetworking’
// b. 如果項(xiàng)目需要一個(gè)指定的pod,需要添加版本號(hào)邑贴,如:
pod ‘objection’, ‘0.9’
// c. 指定版本范圍
pod 'AFNetworking', '=0.1' //版本是0.1
pod 'AFNetworking', '>0.1` //任何大于0.1版本
pod 'AFNetworking', '>=0.1` //0.1和大于0.1版本
pod 'AFNetworking', '<0.1` //小于0.1版本
pod 'AFNetworking', '<=0.1` //0.1和小于0.1版本
pod 'AFNetworking', '~=0.1.2` // 表示是(0.1.2<= pod < 0.2 版本) 席里,安裝這個(gè)范圍內(nèi)最新的版本
- podspec : 引用倉庫根目錄的(from a pod spec in the root of a library repository)引用pod在指定節(jié)點(diǎn)或者分支
//主分支:
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
//指定分支: :branch => 'dev'
pod 'AFNetworking', :git => 'https://github.com/a/AFNetworking.git', :branch => 'dev'
//指定的tag: :tag => '0.7.0'
pod 'AFNetworking', :git => 'https://github.com/b/AFNetworking.git', :tag => '0.7.0'
//指定的節(jié)點(diǎn): :commit => '082f8319af'
pod 'AFNetworking', :git => 'https://github.com/c/AFNetworking.git', :commit => ‘082f8319af'
添加本地框架
//添加本地框架 path后面跟本地框架的詳細(xì)路徑
pod 'TKPermissionKit' , :path => "../"
- abstract_target :定義一個(gè)抽象的target,為了方便target目標(biāo)依賴?yán)^承拢驾。這個(gè)target是沒有被定義在xcode中的奖磁。例子:
// a.定義一個(gè)抽象target
abstract_target 'Networking' do
pod ‘AlamoFire'
target 'Networking App 1’
target 'Networking App 2’
end
// b. 定義一個(gè)包含多個(gè)target的抽象target
# 注意:這是個(gè)抽象的target工程中并沒有這個(gè)target.引入ShowsKit
abstract_target 'Shows' do
pod 'ShowsKit’
# ShowsiOS target會(huì)引入ShowWebAuth庫以及繼承自Shows的ShowsKit庫
target 'ShowsiOS' do
pod 'ShowWebAuth’
end
# ShowsTV target會(huì)引入ShowTVAuth庫以及繼承自Shows的ShowsKit庫
target 'ShowsTV’ do
pod ‘ShowTVAuth'
end
# ShowsTests target引入了Specta和Expecta庫,并且指明繼承Shows独旷,所以也會(huì)引入ShowsKit
target 'ShowsTests’ do
inherit! :search_paths
pod 'Specta’
pod 'Expecta’
end
end
- script_phase 使用這個(gè)命令給target添加shell腳本
target ‘A’ do
script_phase :name => 'HelloWorldScript', :script => 'echo "Hello World”'
script_phase :name => 'HelloWorldScript', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'
end
- abstract! 指定當(dāng)前target是抽象target
target ‘A’ do
abstract!
end
- inherit! 設(shè)置當(dāng)前target的繼承關(guān)系
target 'App’ do
target ‘A’ do
#這個(gè)target 繼承 父級(jí)所有行為
inherit! :complete
end
target ‘B’ do
#這個(gè)target 不繼承 父級(jí)所有行為
inherit! :none
end
target ‘C’ do
#target 僅繼承 父級(jí)的搜索路勁
inherit! :search_paths
end
end
③ 署穗、 執(zhí)行 pod install ,生成管理三方庫的Pods工程
關(guān)于 Podfile.lock (引自:唐巧的博客)
當(dāng)你執(zhí)行
pod install
之后嵌洼,除了 Podfile 外案疲,CocoaPods 還會(huì)生成一個(gè)名為Podfile.lock
的文件,Podfile.lock 應(yīng)該加入到版本控制里面麻养,不應(yīng)該把這個(gè)文件加入到.gitignore
中褐啡。因?yàn)?code>Podfile.lock會(huì)鎖定當(dāng)前各依賴庫的版本,之后如果多次執(zhí)行pod install
不會(huì)更改版本鳖昌,要pod update
才會(huì)改Podfile.lock
了备畦。這樣多人協(xié)作的時(shí)候低飒,可以防止第三方庫升級(jí)時(shí)造成大家各自的第三方庫版本不一致。
CocoaPods 的這篇 官方文檔 也在What is a Podfile.lock
一節(jié)中介紹了Podfile.lock
的作用懂盐,并且指出:
This file should always be kept under version control.
三褥赊、使用CocoaPods管理的三方庫
四、回顧幾個(gè)更新第三方庫的常用的命令
更新所有庫最簡單基本的方法:
pod update
:
更新本地倉庫:
pod repo update
簡單來說莉恼,這條命名是用來更新本地 CocoaPods 的 spec 資源配置信息拌喉。安裝完 CocoaPods 后,在用戶根目錄下有個(gè)隱藏文件夾~/.cocoapods俐银,里面是 CocoaPods 收錄的所有庫的配置信息尿背。pod repo update實(shí)際是更新整個(gè).cocoapods下的所有庫,其實(shí)我們也可以只更新其中某個(gè)庫來達(dá)到快速可用的目的捶惜。
pod repo update ~/.cocoapods/repos/master/Specs/
更新指定第三方庫最簡單基本的方法:
pod update 庫名
把Podfile內(nèi)全部的庫更新重新安裝:
pod install
只更新新添加的庫田藐,已更新的庫忽略:
pod install --verbose --no-repo-update
只更新指定的庫,其它庫忽略:
pod update 庫名 --verbose --no-repo-update
- 參數(shù)解釋
- 參數(shù) –verbose 和 –silent
這兩個(gè)參數(shù)是用來控制 pod 命令的吱七,有些人不希望看到輸出的情況下可以選擇 --silent汽久,--verbose 的意思則是輸出詳細(xì)日志信息。
加 --verbose 的意義在于可以輸出更詳細(xì)的配置過程 debug 信息陪捷,在書寫時(shí)位置也可以換回窘。- 參數(shù) --no-repo-update:
在我們輸入pod install或者pod update之后诺擅,CocoaPods 首先會(huì)去匹配本地的 spec 庫市袖,在確認(rèn) spec 版本庫不需要更新之后,才會(huì)下載相應(yīng)的庫文件烁涌,這樣比較耗時(shí)苍碟。所以一般使用時(shí)會(huì)加上 --no-repo-update,跳過 spec 版本庫更新匹配撮执。
但是這樣會(huì)有個(gè)問題微峰,如果 github 上 pods 的三方庫有新版本了,你本地搜索到的還是舊版本抒钱,如果用的新版本號(hào)是無法裝配的蜓肆,所以每隔一段時(shí)間最好執(zhí)行一下pod repo update。
另外首次 install 不應(yīng)該添加這個(gè)標(biāo)志谋币,后續(xù)修改 Podfile 的時(shí)候可以適當(dāng)使用仗扬,加快 pod 速度。
遇到的更新場景
- 情況一:
Cocoapods 本地 Pod 的索引文件沒有更新蕾额,所以本地庫還是舊版本早芭,自然怎么都無法更新到最新版。
解決方法
:
打開終端诅蝶,查看一下 Cocoapods 的版本號(hào):pod --version
如果不是最新版本退个,升級(jí)一下 Cocoapods 版本:sudo gem install -n /usr/local/bin cocoapods --pre
但是有時(shí)候 Cocoapods 升到最新版本后募壕,cd 到工程文件下pod install,發(fā)現(xiàn)還是沒有更新最新的庫语盈。這時(shí)候需要更新本地 Pod 的索引文件:pod setup或pod repo update舱馅。
此時(shí)再pod install或pod update,應(yīng)該就是最新的了刀荒。
- 情況二:
因?yàn)楣敬罱俗约旱?GitLab 庫习柠,經(jīng)常發(fā)現(xiàn)pod update下來的還是舊代碼。
這是由于 Pod 緩存造成的照棋,雖然本地和遠(yuǎn)程 Git 倉庫都是最新版本资溃,但是本地 Pod 緩存中,依舊有舊版的緩存烈炭,執(zhí)行pod update時(shí)溶锭,會(huì)先從本地緩存讀取數(shù)據(jù)。
解決方法
:
cd 到 ~/資源庫/Caches/CocoaPods/Pods/Release/庫名符隙;
刪除庫名下的文件趴捅,如~/資源庫/Caches/CocoaPods/Pods/Release/庫名/1.0.0-fbd65;
pod cache clean 庫名霹疫;
cd 到項(xiàng)目中拱绑,刪除 Pods/庫名,刪除 Podfile.lock丽蝎,再pod update猎拨,代碼更新成功。