CocoaPods簡介
CocoaPods是一個負責管理iOS項目中第三方開源庫的工具。CocoaPods的項目源碼在Github上管理。該項目開始于2011年8月12日,在這兩年多的時間里,它持續保持活躍更新。開發iOS項目不可避免地要使用第三方開源庫,CocoaPods的出現使得我們可以節省設置和更新第三方開源庫的時間
在我們有了CocoaPods (https://github.com/CocoaPods/CocoaPods) 這個工具之后,只需要將用到的第三方開源庫放到一個名為Podfile的文件中,然后在命令行執行$ pod install命令。CocoaPods就會自動將這些第三方開源庫的源碼下載下來,并且為我們的工程設置好相應的系統依賴和編譯參數。
一、CocoaPods 的安裝
CocoaPods基于Ruby語言開發而成,因此安裝CocoaPods前需要安裝Ruby環境。幸運的是Mac系統默認自帶Ruby環境,如果沒有請自行查找安裝。檢測是否安裝Ruby:
$ gem -v
安裝則會提示當前Ruby版本。
1、RubyGems換源
RubyGems是什么呢?下面是官網給出的一段介紹:
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.
通俗地來講RubyGems就像是一個倉庫,里面包含了各種軟件的包(如Cocoapods、MySql),可以通過命令行的方式來安裝這些軟件包,最為方便的是自動幫你配置好軟件依賴的環境,整個安裝過程僅僅只需要幾行命令行。
我們在安裝CocoaPods的時候,就是通過rubygems來安裝的,由于在國內訪問rubygems非常慢,所以替換rubygems鏡像源就顯得十分必要了。之前很多人用的都是淘寶的鏡像源,現在淘寶的rubygems鏡像源交給Ruby China來維護了,替換rubygems鏡像源的命令行如下:
$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ (這里是需要替換的原來的鏡像源)
$ gem sources -l
https://gems.ruby-china.org
//確保只有 gems.ruby-china.org
2、更新升級 Gem 版本
Gem是管理Ruby庫和程序的標準包,如果它的版本過低也可能導致安裝失敗,解決方案自然是升級Gem,執行下述命令即可:
// 更新升級gem
$ sudo gem update --system
3、更新升級 Ruby 版本
在進行CococaPods安裝的時候,遇到錯誤,錯誤提示大致意思是ruby版本太低,需要升級至2.2.2以上.果然,在終端使用ruby -v查看版本為2.0.
A. 使用RVM也就是Ruby Version Manager,Ruby版本管理器來升級ruby,RVM包含了Ruby的版本管理和Gem庫管理(gemset)。
a. RVM安裝
$ curl -L get.rvm.io | bash -s stable
b. 安裝成功之后,執行下面命令進行驗證。
$ source ~/.bashrc
$ source ~/.bash_profile
c. 無異常,測試是否安裝正常。
$ rvm -v
如果出現rvm(版本號)就算是安裝RVM成功了。
d. 列出已知ruby的版本。
$ rvm list known
稍等一下,會出現很多平臺不同的ruby的版本,因為是需要2.2.2以上的版本,所以直接安裝2.4.0版本。
e. 安裝ruby 2.4.0
$ rvm install 2.4.0
安裝完之后,可以ruby -v 測試一下,看看版本有沒有變化。
f. ruby和gem的關系。
RubyGems 是 Ruby 的一個包管理器,它提供一個分發 Ruby 程序和庫的標準格式,還提供一個管理程序包安裝的工具。
RubyGems 旨在方便地管理 gem 安裝的工具,以及用于分發 gem 的服務器。這類似于 Ubuntu 下的apt-get, Centos 的 yum,Python 的 pip。
RubyGems大約創建于2003年11月,從Ruby 1.9版起成為Ruby標準庫的一部分。所以當我們更新了ruby版本之后發現gem版本號也變成了最新的2.6.10。
4、安裝CocoaPods
// 安裝CocoaPods(OS X 10.11以前)
$ sudo gem install cocoapods
// 安裝CocoaPods(10.11后蘋果升級了安全策略)
$ sudo gem install -n /usr/local/bin cocoapods
如果換成國內鏡像使用 gem install cocoapods 報錯:
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)
說明Gem版本太低需要更新則執行:
$ sudo gem update --system
然后執行以下命令:
$ sudo gem install cocoapods
如果報錯:
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/xcodeproj
執行:
sudo gem install -n /usr/local/bin cocoapods
安裝完成,輸入以下命令檢測是否安裝成功:
$ pod --version
5、更換repo鏡像
所有的項目的Podspec文件都托管在https://github.com/CocoaPods/Specs 第一次執行pod setup時,CocoaPods會將這些podspec索引文件更新到本地的 /.cocoapods/目錄下,這個索引文件比較大,有380M左右,大概花了我3個多小時,噗 想知道為什么慢的原因可以參考這篇博文http://www.cocoachina.com/ios/20170208/18645.html
正式因為如此慢,有人在gitcafe、oschina和coding上建立了CocoaPods索引庫的鏡像,因為他們都是國內的服務器,所以在執行索引更新操作時,會快很多。如下操作可以將CocoaPods設置成使用國內鏡像源:
// 1.移除原有服務器
- pod repo remove master
// 2.添加境內服務器
- 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 (總計218M耗時55分鐘)
另外,在自己工程中的Podfile文件加入下面一行描述:
source 'https://git.coding.net/hging/Specs.git'
如果不加這一句話,它默認還是從github鏡像源地址去下載的,這個不要給忘記了。
注意點:
- master repo里面存放的是所有第三方庫的地址列表,下載第三方庫對應的源碼還是要到指定的源碼存放地址(podspecs中有指定)去下載。更換repo源只是加快了repo的下載速度,并不會加快第三方庫源碼的下載速度,兩者是沒有任何關系的。
- 在工程中盡量避免直接使用pod update、pod install,在后面添加--no-repo-update后使用。
- 工程中依賴第三方庫版本過低,可以先到repos目錄下,使用git clone更新master repo,然后在工程中使用pod update --no-repo-update命令。
上面提到的方案從一定程度上加快了CocoaPods的執行速度,但是仍然避免不了要更新全部repo的情況,而實際情況是我們項目當中用到的第三方庫大部分只需要十幾個,大量的時間被浪費在我們不需要的庫上面了。因為CocoaPods是使用中心化的方式來進行管理的,所以當第三方庫多起來的時候,就會出現剛才的情況,這個時候可以選擇使用Carthage來管理第三方庫,它比CocoaPods最大的優勢就在于去中心化的方式來管理,不過Carthage的缺點是里面的庫還不是很豐富,不過隨著時間的推移就不是問題了。
二、CocoaPods 的使用
1、新建 Podfile 文件
使用時需要在你的項目根目錄下新建一個名為Podfile的文件,將依賴的庫名字依次列在文件中即可。
//進入你的工程目錄
$ cd /Users/***/Demo
//創建Pods文件
$ touch Podfile
2、編輯 Podfile 文件
假設我們想導入 AFNetworking ,進入http://cocoapods.org, 搜索AFNetworking。
//在工程中添加第三方
$ vim Podfile
Podfile 文件的使用方法官方已經更新,格式如下:
platform :ios, "8.0"
target '工程名' do
pod 'AFNetworking'
end
target 后面接的是你的工程的名字
在文本編輯界面按ESC切換為末行模式輸入:wq按下回車返回終端命令行輸入
3、執行導入命令
進入根目錄執行:
- $ pod install
pod install命令執行成功后,會看到工程目錄下多出Foream.xcworkspace、Podfile.lock文件和Pods目錄。再看看剛才執行完pod install命令打印出來的內容的最后一行:From now on use Foream.xcworkspace.提示我們從現在起,我們需要使用Foream.xcworkspace文件來開發。
//更新 CocoaPods 或者以前手動添加過第三方SDK改用Cocopods,可能會出現以下的錯誤:
- [!] 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
產生此警告的原因是項目 Target 中的一些設置,CocoaPods 也做了默認的設置,如果兩個設置結果不一致,就會造成問題。
打開.xcworkspace工程設置,分別在我的項目中定義PODS_ROOT 和 Other Linker Flags的地方,把他們的值用$(inherited)替換掉,或者
Build Setting --> HEADER_SEARCH_PATHS--> 添加$(inherited)
Build Setting --> LIBRARY_SEARCH_PATHS--> 添加$(inherited)
進入終端,執行
pod update
警告沒了
一種簡單粗暴的方法:
點擊項目文件 project.xcodeproj,右鍵顯示包內容,用文本編輯器打開project.pbxproj,刪除OTHER_LDFLAGS的地方,保存,pod update,警告沒了。。。。
4、第三方庫更新
只需要在Podfile文件中添加相應的第三方庫信息,執行pod update命令即可。
5、文件和指令說明
- Podfile.lock文件
- 最后一次更新Pods時, 所有第三方框架的版本號
- 常用指令的區別
- pod install
- 會根據Podfile.lock文件中列舉的版本號來安裝第三方框架
- 如果一開始Podfile.lock文件不存在, 就會按照Podfile文件列舉的版本號來安裝第三方框架
- 安裝框架之前, 默認會執行pod repo update指令
- pod update
- 將所有第三方框架更新到最新版本, 并且創建一個新的Podfile.lock文件
- 安裝框架之前, 默認會執行pod repo update指令
- pod install --no-repo-update
- pod update --no-repo-update
- 安裝框架之前, 不會執行pod repo update指令
- pod install
- 關于Podfile文件編輯時,第三方庫版本號的各種寫法
pod ‘AFNetworking’ //不顯式指定依賴庫版本,表示每次都獲取最新版本
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的版本,相當于>=0.1.2并且<0.2.0
pod ‘AFNetworking’, ‘~>0.1′ //使用大于等于0.1但小于1.0的版本
pod ‘AFNetworking’, ‘~>0′ //高于0的版本,寫這個限制和什么都不寫是一個效果,都表示使用最新版本
寫作此博文時大量參考了以下文章:
- http://www.lxweimin.com/p/3086df14ed08
- http://www.cocoachina.com/ios/20170208/18645.html
- https://guides.cocoapods.org
- 深入理解 CocoaPods
- CocoaPods最佳實踐探討