CocoaPods簡(jiǎn)介
CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫(kù)的工具。CocoaPods的項(xiàng)目源碼在Github上管理。該項(xiàng)目開始于2011年8月12日,在這兩年多的時(shí)間里,它持續(xù)保持活躍更新。開發(fā)iOS項(xiàng)目不可避免地要使用第三方開源庫(kù),CocoaPods的出現(xiàn)使得我們可以節(jié)省設(shè)置和更新第三方開源庫(kù)的時(shí)間
在我們有了CocoaPods (https://github.com/CocoaPods/CocoaPods) 這個(gè)工具之后,只需要將用到的第三方開源庫(kù)放到一個(gè)名為Podfile的文件中,然后在命令行執(zhí)行$ pod install命令。CocoaPods就會(huì)自動(dòng)將這些第三方開源庫(kù)的源碼下載下來(lái),并且為我們的工程設(shè)置好相應(yīng)的系統(tǒng)依賴和編譯參數(shù)。
一、CocoaPods 的安裝
CocoaPods基于Ruby語(yǔ)言開發(fā)而成,因此安裝CocoaPods前需要安裝Ruby環(huán)境。幸運(yùn)的是Mac系統(tǒng)默認(rèn)自帶Ruby環(huán)境,如果沒有請(qǐng)自行查找安裝。檢測(cè)是否安裝Ruby:
$ gem -v
安裝則會(huì)提示當(dāng)前Ruby版本。
1、RubyGems換源
RubyGems是什么呢?下面是官網(wǎng)給出的一段介紹:
The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” and contains a package Ruby application or library.
Gems can be used to extend or modify functionality in Ruby applications. Commonly they’re used to distribute reusable functionality that is shared with other Rubyists for use in their applications and libraries. Some gems provide command line utilities to help automate tasks and speed up your work.
通俗地來(lái)講RubyGems就像是一個(gè)倉(cāng)庫(kù),里面包含了各種軟件的包(如Cocoapods、MySql),可以通過(guò)命令行的方式來(lái)安裝這些軟件包,最為方便的是自動(dòng)幫你配置好軟件依賴的環(huán)境,整個(gè)安裝過(guò)程僅僅只需要幾行命令行。
我們?cè)诎惭bCocoaPods的時(shí)候,就是通過(guò)rubygems來(lái)安裝的,由于在國(guó)內(nèi)訪問(wèn)rubygems非常慢,所以替換rubygems鏡像源就顯得十分必要了。之前很多人用的都是淘寶的鏡像源,現(xiàn)在淘寶的rubygems鏡像源交給Ruby China來(lái)維護(hù)了,替換rubygems鏡像源的命令行如下:
$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ (這里是需要替換的原來(lái)的鏡像源)
$ gem sources -l
https://gems.ruby-china.org
//確保只有 gems.ruby-china.org
2、更新升級(jí) Gem 版本
Gem是管理Ruby庫(kù)和程序的標(biāo)準(zhǔn)包,如果它的版本過(guò)低也可能導(dǎo)致安裝失敗,解決方案自然是升級(jí)Gem,執(zhí)行下述命令即可:
// 更新升級(jí)gem
$ sudo gem update --system
3、更新升級(jí) Ruby 版本
在進(jìn)行CococaPods安裝的時(shí)候,遇到錯(cuò)誤,錯(cuò)誤提示大致意思是ruby版本太低,需要升級(jí)至2.2.2以上.果然,在終端使用ruby -v查看版本為2.0.
A. 使用RVM也就是Ruby Version Manager,Ruby版本管理器來(lái)升級(jí)ruby,RVM包含了Ruby的版本管理和Gem庫(kù)管理(gemset)。
a. RVM安裝
$ curl -L get.rvm.io | bash -s stable
b. 安裝成功之后,執(zhí)行下面命令進(jìn)行驗(yàn)證。
$ source ~/.bashrc
$ source ~/.bash_profile
c. 無(wú)異常,測(cè)試是否安裝正常。
$ rvm -v
如果出現(xiàn)rvm(版本號(hào))就算是安裝RVM成功了。
d. 列出已知ruby的版本。
$ rvm list known
稍等一下,會(huì)出現(xiàn)很多平臺(tái)不同的ruby的版本,因?yàn)槭切枰?.2.2以上的版本,所以直接安裝2.4.0版本。
e. 安裝ruby 2.4.0
$ rvm install 2.4.0
安裝完之后,可以ruby -v 測(cè)試一下,看看版本有沒有變化。
f. ruby和gem的關(guān)系。
RubyGems 是 Ruby 的一個(gè)包管理器,它提供一個(gè)分發(fā) Ruby 程序和庫(kù)的標(biāo)準(zhǔn)格式,還提供一個(gè)管理程序包安裝的工具。
RubyGems 旨在方便地管理 gem 安裝的工具,以及用于分發(fā) gem 的服務(wù)器。這類似于 Ubuntu 下的apt-get, Centos 的 yum,Python 的 pip。
RubyGems大約創(chuàng)建于2003年11月,從Ruby 1.9版起成為Ruby標(biāo)準(zhǔn)庫(kù)的一部分。所以當(dāng)我們更新了ruby版本之后發(fā)現(xiàn)gem版本號(hào)也變成了最新的2.6.10。
4、安裝CocoaPods
// 安裝CocoaPods(OS X 10.11以前)
$ sudo gem install cocoapods
// 安裝CocoaPods(10.11后蘋果升級(jí)了安全策略)
$ sudo gem install -n /usr/local/bin cocoapods
如果換成國(guó)內(nèi)鏡像使用 gem install cocoapods 報(bào)錯(cuò):
ERROR: While executing gem ... (Gem::DependencyError) Unable to resolve dependencies: cocoapods requires cocoapods-core (= 1.1.1), cocoapods-downloader (< 2.0, >= 1.1.2), cocoapods-trunk (< 2.0, >= 1.1.1), xcodeproj (< 2.0, >= 1.3.3)
說(shuō)明Gem版本太低需要更新則執(zhí)行:
$ sudo gem update --system
然后執(zhí)行以下命令:
$ sudo gem install cocoapods
如果報(bào)錯(cuò):
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/xcodeproj
執(zhí)行:
sudo gem install -n /usr/local/bin cocoapods
安裝完成,輸入以下命令檢測(cè)是否安裝成功:
$ pod --version
5、更換repo鏡像
所有的項(xiàng)目的Podspec文件都托管在https://github.com/CocoaPods/Specs 第一次執(zhí)行pod setup時(shí),CocoaPods會(huì)將這些podspec索引文件更新到本地的 /.cocoapods/目錄下,這個(gè)索引文件比較大,有380M左右,大概花了我3個(gè)多小時(shí),噗 想知道為什么慢的原因可以參考這篇博文http://www.cocoachina.com/ios/20170208/18645.html
正式因?yàn)槿绱寺腥嗽趃itcafe、oschina和coding上建立了CocoaPods索引庫(kù)的鏡像,因?yàn)樗麄兌际菄?guó)內(nèi)的服務(wù)器,所以在執(zhí)行索引更新操作時(shí),會(huì)快很多。如下操作可以將CocoaPods設(shè)置成使用國(guó)內(nèi)鏡像源:
// 1.移除原有服務(wù)器
- pod repo remove master
// 2.添加境內(nèi)服務(wù)器
- pod repo add master https://gitcafe.com/akuandev/Specs.git
- pod repo add master http://git.oschina.net/akuandev/Specs.git
- pod repo add master https://git.coding.net/hging/Specs.git (總計(jì)218M耗時(shí)55分鐘)
另外,在自己工程中的Podfile文件加入下面一行描述:
source 'https://git.coding.net/hging/Specs.git'
如果不加這一句話,它默認(rèn)還是從github鏡像源地址去下載的,這個(gè)不要給忘記了。
注意點(diǎn):
- master repo里面存放的是所有第三方庫(kù)的地址列表,下載第三方庫(kù)對(duì)應(yīng)的源碼還是要到指定的源碼存放地址(podspecs中有指定)去下載。更換repo源只是加快了repo的下載速度,并不會(huì)加快第三方庫(kù)源碼的下載速度,兩者是沒有任何關(guān)系的。
- 在工程中盡量避免直接使用pod update、pod install,在后面添加--no-repo-update后使用。
- 工程中依賴第三方庫(kù)版本過(guò)低,可以先到repos目錄下,使用git clone更新master repo,然后在工程中使用pod update --no-repo-update命令。
上面提到的方案從一定程度上加快了CocoaPods的執(zhí)行速度,但是仍然避免不了要更新全部repo的情況,而實(shí)際情況是我們項(xiàng)目當(dāng)中用到的第三方庫(kù)大部分只需要十幾個(gè),大量的時(shí)間被浪費(fèi)在我們不需要的庫(kù)上面了。因?yàn)镃ocoaPods是使用中心化的方式來(lái)進(jìn)行管理的,所以當(dāng)?shù)谌綆?kù)多起來(lái)的時(shí)候,就會(huì)出現(xiàn)剛才的情況,這個(gè)時(shí)候可以選擇使用Carthage來(lái)管理第三方庫(kù),它比CocoaPods最大的優(yōu)勢(shì)就在于去中心化的方式來(lái)管理,不過(guò)Carthage的缺點(diǎn)是里面的庫(kù)還不是很豐富,不過(guò)隨著時(shí)間的推移就不是問(wèn)題了。
二、CocoaPods 的使用
1、新建 Podfile 文件
使用時(shí)需要在你的項(xiàng)目根目錄下新建一個(gè)名為Podfile的文件,將依賴的庫(kù)名字依次列在文件中即可。
//進(jìn)入你的工程目錄
$ cd /Users/***/Demo
//創(chuàng)建Pods文件
$ touch Podfile
2、編輯 Podfile 文件
假設(shè)我們想導(dǎo)入 AFNetworking ,進(jìn)入http://cocoapods.org, 搜索AFNetworking。
//在工程中添加第三方
$ vim Podfile
Podfile 文件的使用方法官方已經(jīng)更新,格式如下:
platform :ios, "8.0"
target '工程名' do
pod 'AFNetworking'
end
target 后面接的是你的工程的名字
在文本編輯界面按ESC切換為末行模式輸入:wq按下回車返回終端命令行輸入
3、執(zhí)行導(dǎo)入命令
進(jìn)入根目錄執(zhí)行:
- $ pod install
pod install命令執(zhí)行成功后,會(huì)看到工程目錄下多出Foream.xcworkspace、Podfile.lock文件和Pods目錄。再看看剛才執(zhí)行完pod install命令打印出來(lái)的內(nèi)容的最后一行:From now on use Foream.xcworkspace.提示我們從現(xiàn)在起,我們需要使用Foream.xcworkspace文件來(lái)開發(fā)。
//更新 CocoaPods 或者以前手動(dòng)添加過(guò)第三方SDK改用Cocopods,可能會(huì)出現(xiàn)以下的錯(cuò)誤:
- [!] The
Foream [Release]
target overrides theHEADER_SEARCH_PATHS
build setting defined in `Pods/Target Support Files/Pods-Foream/Pods-Foream.release.xcconfig'. This can lead to problems with the CocoaPods installation- Use the
$(inherited)
flag, or - Remove the build settings from the target.
- Use the
產(chǎn)生此警告的原因是項(xiàng)目 Target 中的一些設(shè)置,CocoaPods 也做了默認(rèn)的設(shè)置,如果兩個(gè)設(shè)置結(jié)果不一致,就會(huì)造成問(wèn)題。
打開.xcworkspace工程設(shè)置,分別在我的項(xiàng)目中定義PODS_ROOT 和 Other Linker Flags的地方,把他們的值用$(inherited)替換掉,或者
Build Setting --> HEADER_SEARCH_PATHS--> 添加$(inherited)
Build Setting --> LIBRARY_SEARCH_PATHS--> 添加$(inherited)
進(jìn)入終端,執(zhí)行
pod update
警告沒了
一種簡(jiǎn)單粗暴的方法:
點(diǎn)擊項(xiàng)目文件 project.xcodeproj,右鍵顯示包內(nèi)容,用文本編輯器打開project.pbxproj,刪除OTHER_LDFLAGS的地方,保存,pod update,警告沒了。。。。
4、第三方庫(kù)更新
只需要在Podfile文件中添加相應(yīng)的第三方庫(kù)信息,執(zhí)行pod update命令即可。
5、文件和指令說(shuō)明
- Podfile.lock文件
- 最后一次更新Pods時(shí), 所有第三方框架的版本號(hào)
- 常用指令的區(qū)別
- pod install
- 會(huì)根據(jù)Podfile.lock文件中列舉的版本號(hào)來(lái)安裝第三方框架
- 如果一開始Podfile.lock文件不存在, 就會(huì)按照Podfile文件列舉的版本號(hào)來(lái)安裝第三方框架
- 安裝框架之前, 默認(rèn)會(huì)執(zhí)行pod repo update指令
- pod update
- 將所有第三方框架更新到最新版本, 并且創(chuàng)建一個(gè)新的Podfile.lock文件
- 安裝框架之前, 默認(rèn)會(huì)執(zhí)行pod repo update指令
- pod install --no-repo-update
- pod update --no-repo-update
- 安裝框架之前, 不會(huì)執(zhí)行pod repo update指令
- pod install
- 關(guān)于Podfile文件編輯時(shí),第三方庫(kù)版本號(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的版本,相當(dāng)于>=0.1.2并且<0.2.0
pod ‘AFNetworking’, ‘~>0.1′ //使用大于等于0.1但小于1.0的版本
pod ‘AFNetworking’, ‘~>0′ //高于0的版本,寫這個(gè)限制和什么都不寫是一個(gè)效果,都表示使用最新版本
寫作此博文時(shí)大量參考了以下文章:
- http://www.lxweimin.com/p/3086df14ed08
- http://www.cocoachina.com/ios/20170208/18645.html
- https://guides.cocoapods.org
- 深入理解 CocoaPods
- CocoaPods最佳實(shí)踐探討