寫在前面:如果你是首次使用CocoaPods瞻离,目標(biāo)是快準(zhǔn)狠的安裝和使用秉溉,可以直接看安裝腾它、具體使用跑筝、使用補(bǔ)充三部分快速上手嘗鮮。有一定經(jīng)驗(yàn)后回來具體看看每部指令的含義瞒滴,你會(huì)對(duì)CocoaPods了解越來越深~
一曲梗、CocoaPods簡(jiǎn)介:
CocoaPods是負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫的工具,CocoaPods能讓我們集中妓忍、統(tǒng)一管理第三方開源庫虏两,為我們節(jié)省設(shè)置和更新第三方開源庫的時(shí)間。
二世剖、CocoaPods安裝:
在正式開始介紹安裝CocoaPods定罢,溫馨提示如下:
操作命令中間可能有空格看不出來,建議直接復(fù)制粘貼執(zhí)行旁瘫;
CocoaPods是由ruby語言編寫的祖凫。我們需要通過Ruby來安裝CocoaPods(至于為什么,我百度過也不知道原因酬凳,知道的朋友可以留言~)惠况。然后因?yàn)镸ac電腦自帶Ruby環(huán)境,我們就只需打開終端開始動(dòng)手宁仔。但是默認(rèn)情況下mac系統(tǒng)自帶的Ruby環(huán)境版本比較低(大概是2.0.0版本的)售滤,現(xiàn)在安裝CocoaPods需要2.2.2版本及以上的,所以我們不管三七二十一先直接先升級(jí)ruby台诗。
安裝CocoaPods整體思路是:更新ruby->設(shè)置CocoaPods下載地址->下載并安裝CocoaPods->使用CocoaPods
正式安裝:
1完箩、打開終端(不會(huì)的請(qǐng)自行百度)
2、查看當(dāng)前Ruby版本(一般都是2.0.0拉队,如果已經(jīng)是最新版本的弊知,可以跳過2-7兩步)
ruby -v
3、升級(jí)Ruby環(huán)境粱快,需要借助rvm(rvm是一個(gè)便捷的多版本ruby環(huán)境的管理和切換工具)秩彤。安裝rvm(第一步要下載一些東西等兩分鐘左右);有rvm可以跳過3事哭、4步漫雷,不確定可執(zhí)行第4步檢查
curl -L get.rvm.io | bash -s stable
source ~/.bashrc
source ~/.bash_profile
4、查看rvm版本(有版本號(hào)就表示安裝成功)
rvm -v
5鳍咱、檢出ruby可安裝的版本信息
rvm list known
6降盹、安裝一個(gè)ruby版本(可以是2.4.1版本,當(dāng)然你也可以選擇其他的)
rvm install 2.4.1
7谤辜、設(shè)置為默認(rèn)版本
rvm use 2.4.1 --default
8蓄坏、更換源(由于國(guó)內(nèi)訪問的CocoaPods國(guó)外下載路徑被墻价捧,我們需要來修改更換源,把源切換至ruby-china涡戳;網(wǎng)上大多數(shù)是使用的https://ruby.taobao.org的结蟋,這里不再建議使用的了,這是因?yàn)閠aobao Gems 源已停止維護(hù)渔彰,現(xiàn)由 ruby-china 提供鏡像服務(wù))
sudo gem update --system // 更新gem
gem sources --remove https://rubygems.org/ // 移除舊有鏡像資源地址
gem sources -a https://gems.ruby-china.org/ // 添加新的鏡像資源地址
9嵌屎、為了驗(yàn)證你的Ruby鏡像是并且僅是ruby-china,執(zhí)行以下命令查看
gem sources -l
如果是以下結(jié)果說明正確恍涂,如果有其他的請(qǐng)自行百度解決
*** CURRENT SOURCES ***
https://gems.ruby-china.org/
10编整、終于正式安裝CocoaPods
sudo gem install cocoapods
sudo gem install -n /usr/local/bin cocoapods // macOS 10.11系統(tǒng)后使用。現(xiàn)在基本上用這個(gè)命令
11乳丰、如果安裝了多個(gè)Xcode使用下面的命令選擇(一般需要選擇最近的Xcode版本)
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
12、初始化本地庫(作用:將CocoaPods記錄的所有第三方庫下載信息下載到本地~/.cocoapods/repos/master
下面)
pod setup
13内贮、執(zhí)行以上命令后會(huì)輸出一句話:Setting up CocoaPods master repo
产园,然后就是漫長(zhǎng)的等待,并不是卡死了而是在下載文件(下載完成后大概800多兆)夜郁。網(wǎng)速稍好些什燕,幾分鐘就好了,人品不好網(wǎng)絡(luò)差的可能會(huì)等很久很久很久........
查看文件下載進(jìn)度的可以另外打開一個(gè)終端窗口(快捷鍵:選中終端按下Command+N組合鍵)竞端,復(fù)制粘貼以下兩行命令回車執(zhí)行
cd ~/.cocoapods
du -sh *
執(zhí)行du -sh *
之后會(huì)顯示已下載的文件大小屎即,可以多次執(zhí)行來監(jiān)看下載進(jìn)度,如果之前還有文件大小事富,后來變成0了技俐,可能是網(wǎng)絡(luò)問題,下載已經(jīng)中斷了,需要結(jié)束命令并從新執(zhí)行 pod setup
網(wǎng)上有文章說可以將別人機(jī)器上~/.cocoapods/repos/master下面的文件copy到自己電腦上的文件里可以跳過這步统台,本人親測(cè)過雕擂,或多或少都有點(diǎn)問題。如果復(fù)制后贱勃,執(zhí)行pod setup依然會(huì)清空原來內(nèi)容重新下載井赌,而不是智能的根據(jù)已下載的內(nèi)容走剩下的流程,白復(fù)制贵扰,所以還是乖乖下載吧仇穗。
14、下載安裝完成之后可執(zhí)行下列命令檢查是否可用(第一次使用要等一會(huì)戚绕,因?yàn)檫@個(gè)時(shí)候CocoaPods需要生成本地的封裝庫搜索文件目錄)纹坐;
pod search AFNetworking
如果是以下結(jié)果說明正確,如果有其他的請(qǐng)自行百度解決;AFNetworking+AutoRetry (0.0.5)
不是我們要找的,AFNetworking (3.1.0)
才是舞丛。退出搜索結(jié)果界面輸入wq
-> AFNetworking (3.1.0)
A delightful iOS and OS X networking framework.
pod 'AFNetworking', '~> 3.1.0'
- Homepage: https://github.com/AFNetworking/AFNetworking
- Source: https://github.com/AFNetworking/AFNetworking.git
- Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3,
3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0,
2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1, 1.3.4,
1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2,
1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1 [master repo]
- Subspecs:
- AFNetworking/Serialization (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Reachability (3.1.0)
- AFNetworking/NSURLSession (3.1.0)
- AFNetworking/UIKit (3.1.0)
-> AFNetworking+AutoRetry (0.0.5)
Auto Retries for AFNetworking requests
pod 'AFNetworking+AutoRetry', '~> 0.0.5'
- Homepage: https://github.com/shaioz/AFNetworking-AutoRetry
三恰画、CocoaPods的使用
1宾茂、 新建一個(gè)Xcode工程,使用終端cd到工程目錄下(項(xiàng)目的.xcodeproj
同級(jí)文件夾)
2拴还、創(chuàng)建Podfile文件:
pod init
之后就可以在項(xiàng)目目錄里看到一個(gè)Podfile
文件
3跨晴、命令行打開Podfile文件或直接雙擊打開Podfile
文件:
open Podfile
4、添加需要的第三方庫(以AFNetworking
為例)片林,在打開的Podfile最下面添加以下內(nèi)容:
pod 'AFNetworking' // 這里示范端盆,所以不指定版本號(hào),就是下載最新的第三方庫费封。
// pod 'AFNetworking', '~> 3.1.0' // 實(shí)際工作中焕妙,必須要指定版本。
5弓摘、保存(command + S
)后退出
6焚鹊、開始下載:
pod install --no-repo-update
終端的結(jié)果沒有紅色的內(nèi)容,基本上安裝成功了韧献。
7末患、打開.xcworkspace
。一開始如果不習(xí)慣CocoaPods锤窑,往往會(huì)繼續(xù)打開.xcodeproj
運(yùn)行工程璧针,然后成功報(bào)錯(cuò)的哦。使用CocoaPods 需要打開.xcworkspace
才能成功運(yùn)行工程~
8渊啰、卸載CocoaPods探橱。雖然很少用到,但貼心附上卸載CocoaPods的命令:
sudo gem uninstall cocoapods
四绘证、CocoaPods具體使用補(bǔ)充
1隧膏、 podfile文件內(nèi)容簡(jiǎn)單介紹:
// 用來設(shè)置所有第三方庫所支持的iOS最低版本
platform :ios, '7.0'
target 'test' do // test是項(xiàng)目名
// 如果是swift項(xiàng)目,這句話保留嚷那;如果是OC項(xiàng)目私植,這句話要?jiǎng)h除
use_frameworks!
// 添加第三方類庫
pod 'AFNetworking'
// 添加指定版本號(hào)的第三方類庫
pod 'SVProgressHUD', '1.1.3'
2、 版本說明
// 設(shè)置框架的名稱和版本號(hào)
pod 'SDWebImage','~>3.7.5'//任何高于或等于3.7.5的版本车酣,但是不包含高于4.0.0版本
// 版本號(hào)的規(guī)則:
// '>1.0' 可以安裝任何高于1.0的版本
// '>=1.0' 可以安裝任何高于或等于1.0的版本
// '<1.0' 任何低于1.0的版本
// '<=1.0' 任何低于或等于1.0的版本
// '~>0.1' 任何高于或等于0.1的版本曲稼,但是不包含高于1.0的版本
// '~>0' 任何版本,相當(dāng)于不指定版本湖员,默認(rèn)采用最新版本號(hào)
溫馨提示:
- 工作中建議使用'~>0 .1' 方式指定版本號(hào)贫悄,不建議不指定版本號(hào)。因?yàn)榘姹咎?hào)的命名規(guī)則娘摔,每個(gè)0.01版本增加窄坦,一般是bug修復(fù)等小改動(dòng);每個(gè)0.1版本增加是引入或更新新的第三方庫,或增加新的小功能等鸭津;每個(gè)1.0版本增加往往是大的新功能增加或者變量彤侍、方法命名等有大改變,往往對(duì)我們引用造成很大影響逆趋,因?yàn)榭赡芤{(diào)整項(xiàng)目中的代碼盏阶。如果不指示版本號(hào),就會(huì)容易出現(xiàn)下載超過大于1.0版本的第三方庫闻书,出現(xiàn)不可知問題哦名斟。
- 指定版本號(hào)也方便知道目前引用的第三方庫大概是什么版本號(hào),當(dāng)然具體的可以到podfile.lock中查看魄眉。這遠(yuǎn)比手工拖入第三方庫好的多砰盐。畢竟如果你手工拖入第三方庫,并且沒有做任何標(biāo)示坑律,天知道你下載的是哪個(gè)版本的岩梳,后續(xù)維護(hù)就是一個(gè)巨坑。本人就試過想將手工拖入的第三方庫轉(zhuǎn)移到CocoaPods中晃择,由于不知道原版本號(hào)冀值,只能指定最新的版本號(hào),一運(yùn)行成功藕各,各種飄紅~
3、 podfile和podfile.lock的區(qū)別
Podfile文件:
1. 記錄本項(xiàng)目中的第三方庫版本要求焦除。
2. 必須做版本管理,項(xiàng)目成員間保持一致激况。
Podfile.lock文件:
1. 記錄最后一次更新Pods時(shí), 所有第三方框架的最終版本號(hào)。
2. 推薦做版本管理膘魄。除了項(xiàng)目很復(fù)雜乌逐,需要針對(duì)不同內(nèi)容使用不同第三方庫依賴時(shí)不做版本管理
4、 常用指令介紹
// 根據(jù)Podfile.lock文件中列舉的版本號(hào)來安裝第三方框架
// 如果一開始Podfile.lock文件不存在, 就會(huì)按照Podfile文件列舉的版本號(hào)來安裝第三方框架
// pod install
// 將所有第三方框架更新到最新版本, 并且創(chuàng)建一個(gè)新的Podfile.lock文件
// pod update // 更新Podfile中所有的第三方庫
// pod update PODNAME // 只更新某個(gè)特定的庫
// 上述兩個(gè)指令在執(zhí)行前默認(rèn)會(huì)執(zhí)行pod repo update指令
// 長(zhǎng)時(shí)間不更新鏡像创葡,會(huì)出現(xiàn)pod search的結(jié)果低于實(shí)際上該第三方庫在github上的版本浙踢。這個(gè)時(shí)候就執(zhí)行該命令更新鏡像,否則就無法下載最新的第三方庫
pod repo update
// 由于不需要經(jīng)常更新第三方庫灿渴,也沒必要一定要下載最新的第三方庫(有可能還不穩(wěn)定)洛波,另外更新鏡像很費(fèi)時(shí)間,實(shí)際中往往不每次都更新鏡像骚露,需要帶上后綴--no-repo-update蹬挤,以免執(zhí)行pod repo update指令
pod install --no-repo-update // 推薦使用
// pod update --no-repo-update // 不推薦使用
pod update PODNAME --no-repo-update // 推薦使用, PODNAME應(yīng)改為具體的第三方庫庫名
// 檢出那些所有較Podfile.lock里面有新版本的庫(那些當(dāng)前被安裝著的庫的版本)
pod outdated
5、 pod install & pod update區(qū)別
- 舉個(gè)例子好說明:
// 1. 初次建立項(xiàng)目棘幸,Podfile中第三方庫要求如下:
pod 'SDWebImage','~>3.7.5'
pod 'AFNetworking', '~> 3.1.0'
// 2. 使用pod install --no-repo-update后焰扳,會(huì)安裝SDWebImage和AFNetworking,在Podfile.lock中版本號(hào)分別是3.7.5和3.1.0
pod install --no-repo-update
// 3. 后來AFNetworking的作者發(fā)布3.2.0最新包,SDWebImage沒變化吨悍;沒有對(duì)Podfile中第三方庫要求做任何修改
// 4.1 若此時(shí)執(zhí)行pod install --no-repo-update
pod install --no-repo-update
// 由于已經(jīng)有Podfile.lock扫茅,當(dāng)前已安裝的第三方庫(Podfile.lock記錄的)依然符合Podfile中要求,不會(huì)做任何處理育瓜;即當(dāng)前SDWebImage和AFNetworking葫隙,依然是3.7.5和3.1.0
// 4.2 若此時(shí)執(zhí)行pod update --no-repo-update
pod update --no-repo-update
// 不管有沒有Podfile.lock,CocoaPods會(huì)找遠(yuǎn)方服務(wù)器最新的爆雹,并且符合Podfile中要求的第三方庫更新停蕉,并重新生成Podfile.lock;即當(dāng)前SDWebImage和AFNetworking钙态,依然是3.7.5和3.2.0
// 5.要注意的是慧起,假如項(xiàng)目中SDWebImage和AFNetworking,依然是3.7.5和3.1.0册倒。遠(yuǎn)方服務(wù)器SDWebImage和AFNetworking最新的版本是3.8.5和3.2.0
// 需要引入新的第三方庫MJExtension
pod 'MJExtension', '~> 3.0.13'
// 5.1 若只是引入MJExtension而不更新已有的庫蚓挤,執(zhí)行
pod install --no-repo-update
// 此時(shí)SDWebImage和AFNetworking,依然是3.7.5和3.1.0驻子;并增加MJExtension(3.0.13)
// 5.2若不僅要引入MJExtension并更新已有的庫灿意,執(zhí)行
pod update --no-repo-update
// // 此時(shí)SDWebImage和AFNetworking,升級(jí)到3.8.5和3.2.0崇呵;并增加MJExtension(3.0.13)
-
使用pod install/update命令安裝框架后的大致過程:
01 分析依賴:該步驟會(huì)分析Podfile,查看不同類庫之間的依賴情況缤剧。如果有多個(gè)類庫依賴于同一個(gè)類庫,但是依賴于不同的版本域慷,那么cocoaPods會(huì)自動(dòng)設(shè)置一個(gè)兼容的版本荒辕。 02-1 下載依賴(pod install):根據(jù)分析依賴的結(jié)果,根據(jù)Podfile.lock是否已有符合的第三方庫犹褒,若有則不下載抵窒,若無則下載指定版本的類庫到本地項(xiàng)目中,并更新Podfile.lock叠骑。 02-2 下載依賴(pod update):根據(jù)分析依賴的結(jié)果李皇,無視已有的版本庫,下載最新的指定版本的類庫到本地項(xiàng)目中宙枷,并更新Podfile.lock掉房。 03 生成Pods項(xiàng)目:創(chuàng)建一個(gè)Pods項(xiàng)目專門用來編譯和管理第三方框架,CocoaPods會(huì)將所需的框架慰丛,庫等內(nèi)容添加到項(xiàng)目中圃阳,并且進(jìn)行相應(yīng)的配置。 04 整合Pods項(xiàng)目:將Pods和項(xiàng)目整合到一個(gè)工作空間中璧帝,并且設(shè)置文件鏈接捍岳。
7、 CocoaPods specs的鏡像索引
CocoaPods specs的鏡像索引是指CocoaPods管理的全球所有第三方庫相關(guān)信息在本地的查詢數(shù)據(jù)。CocoaPods需要依靠本地的鏡像索引來獲取服務(wù)端中對(duì)應(yīng)的第三方庫信息(下載地址等)并進(jìn)行分析下載锣夹。
所有的項(xiàng)目的podspec文件(鏡像索引文件)都托管在https://github.com/CocoaPods/Specs上页徐。
第一次執(zhí)行pod setup時(shí),cocoapods會(huì)將這些podspec索引文件更新到本地的 ~/银萍。cocoapods/目錄下变勇,這個(gè)索引文件比較大,國(guó)內(nèi)網(wǎng)絡(luò)的問題贴唇,更新非常慢搀绣。
國(guó)內(nèi)很多善丈人翁就在國(guó)內(nèi)建了新的地址,并及時(shí)和國(guó)外的保持同步戳气,大家使用之余要記得感恩链患,不過這些國(guó)內(nèi)的地址不時(shí)就會(huì)失效,目前最新的是https://gems.ruby-china.org
使用方法:
pod repo remove master // 移除舊有鏡像資源地址
pod repo add master https://gems.ruby-china.org // 添加新的鏡像資源地址
pod repo update // 更新鏡像
- 后續(xù)使用中進(jìn)行pod repo update 時(shí)(pod update瓶您、pod install 默認(rèn)執(zhí)行pod repo update命令)麻捻,會(huì)去更新獲取pod specs。
8呀袱、 使用注意:不是所有的庫都可以由CocoaPods管理贸毕。需要該第三方庫擁有.podspec
才行。.podspec
包含了該第三方庫的名稱夜赵、版本號(hào)明棍、下載地址、第三方庫依賴等信息寇僧。CocoaPods需要根據(jù)該信息才能找到對(duì)應(yīng)的下載地址
五摊腋、CocoaPods拓展-原理和組件化
CocoaPods原理
CocoaPods 背后的理念主要體現(xiàn)在兩個(gè)方面。首先,在工程中引入第三方代碼會(huì)涉及到許多內(nèi)容婉宰。針對(duì) Objective-C初級(jí)開發(fā)者來說,工程文件的配置會(huì)讓人很沮喪歌豺。在配置buildphases和linker flags過程中,會(huì)引起許多人為因素的 錯(cuò)誤推穷。CocoaPods 簡(jiǎn)化了這一切,它能夠自動(dòng)配置編譯選項(xiàng)心包。
其次,通過 CocoaPods,可以很方便的查找到新的第三方庫。當(dāng)然,這并不是 說你可以簡(jiǎn)單的將別人提供的庫拿來拼湊成一個(gè)應(yīng)用程序馒铃。它的真正作用是讓你能夠找到真正好用的庫,以此來縮短我們的開發(fā)周期和提升軟件的質(zhì)量蟹腾。
CocoaPods的原理,它是將所有的依賴庫都放到另一個(gè)名為Pods項(xiàng)目中,然后讓主項(xiàng)目依賴Pods項(xiàng)目,這樣,源碼管理工作都從主項(xiàng)目移到了Pods項(xiàng)目中
1、Pods項(xiàng)目最終會(huì)編譯成一個(gè)名為libPods.a的文件,主項(xiàng)目只需要依賴這個(gè).a 文件即可区宇。
2娃殖、對(duì)于資源文件,CocoaPods提供了一個(gè)名為Pods-resources.sh的bash腳本, 該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行,將第三方庫的各種資源文件復(fù)制到目 標(biāo)目錄中。
3议谷、CocoaPods通過一個(gè)名為Pods.xcconfig的文件來在編譯時(shí)設(shè)置所有的依賴和 參數(shù)炉爆。
CocoaPods組件化
試想一下,既然CocoaPods能夠管理第三方庫,那為什么不管理公司自有的封裝庫芬首,方便公司內(nèi)部跨app使用和測(cè)試赴捞?在這種思路下,組件化就應(yīng)運(yùn)而生了郁稍。目前越來越多的公司CocoaPods來實(shí)現(xiàn)組件化赦政。有興趣的可以自行搜一下關(guān)于組件化的內(nèi)容。