Cocoapods 的安裝、使用及其配置
專案中有第三方庫?
不用 Cocoapods 真是你的損失吶。
Basic
如果你只是想用 Cocoapods 把第三方庫匯入你的工程,本章內容目的就是以最快速度讓你把 Cocoapods 應用到你的專案中。
Installation
Cocoapods 基於 Ruby,OS X 已經安裝好 Ruby。限於國內的網路,此處先修改 RubyGems 源的地址。
$ gem sources --remove https://rubygems.org/ $ gem sources -a http://ruby.taobao.org/ |
執行完畢後,驗證是否修改成功。
$ gem sources -l
|
如果顯示如下資訊代表修改成功。
*** CURRENT SOURCES *** http://ruby.taobao.org/ |
接下來安裝 Cocoapods
$ sudo gem install cocoapods
|
Usage
如果你還沒裝 Alcatraz,那請你先安裝 Alcatraz。
curl -fsSL https://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh
|
進入你要新增第三方庫的工程,按command + shift + 9
調出 Alcatraz
搜尋介面,搜尋 Cocoapods 並安裝。
安裝完畢後,重啟 Xcode,如下圖點選建立 Podfile。
以 AFNetworking
為例,在 Podfile 檔案中寫入並儲存。
platform :ios, "7.0"
pod "AFNetworking"
|
這時 Cocoapods 外掛已經可以選擇安裝了。
點選安裝
提示重新啟動並開啟 .workspace
檔案,現在你已經可以愉快的引用 AFNetworking.h
咯!
Advanced
本章內容有助於你提高對 Cocoapods 更深層次的理解。
Commands
1. pod install
根據在 Podfile 中配置好的第三方庫資訊來安裝對應的庫。
如果存在 Podfile.lock 檔案則根據 Podfile.lock 中鎖定的版本進行安裝。
每次更新了Podfile檔案時,都需要重新執行該命令,以便重新安裝Pods依賴庫。
2. pod update
很多情況下,Podfile 中的第三方庫資訊格式並沒有指定某個庫的具體版本,那麼在執行 pod
update
後,第三方庫都會更新到最新版本且 Podfile.lock 會一同更新。
3. pod search
執行
$ pod search AFNetworking
|
得到如下資訊:
-> AFNetworking (2.5.4) A delightful iOS and OS X networking framework. pod 'AFNetworking', '~> 2.5.4' - Homepage: https://github.com/AFNetworking/AFNetworking - Source: https://github.com/AFNetworking/AFNetworking.git - Versions: 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 (2.5.4) - AFNetworking/Security (2.5.4) - AFNetworking/Reachability (2.5.4) - AFNetworking/NSURLConnection (2.5.4) - AFNetworking/NSURLSession (2.5.4) - AFNetworking/UIKit (2.5.4) |
選擇你的目的版本配置到 Podfile 檔案中。
4. pod setup
在本地 Cocoapods 會儲存一個 Pods 依賴庫的 tree,這個 tree 和服務端的 tree 可能會不同步。因為大量第三方庫的作者每天都在維護自己的庫,會更新庫的版本,執行
$ pod setup
|
可以讓本地依賴庫的 tree 與服務端同步。
Usage
上一章中,介紹了通過 Xcode 外掛來實現利用 Cocoapods 引入第三方庫的方法。然而很多程式設計師覺得還是用命令列介面去操作這一切才更 Cool。
下文以 YOUR_PROJECT
代替專案路徑為例,介紹下命令列中 Cocoapods
的使用方法。
$ cd YOUR_PROJECT $ touch Podfile |
開啟你的 Xcode 或者 其他編輯器也行,開始編輯 Podfile,此處依舊以 AFNetworking
為例
platform :ios, "7.0"
pod "AFNetworking"
|
編輯好後,還在YOUR_PROJECT
路徑下,執行
$ pod install
|
正常情況下將會出現如下提示
Updating local specs repositories Analyzing dependencies Downloading dependencies Installing AFNetworking (2.5.4) Generating Pods project Integrating client project Sending stats |
然後開啟你專案的 .workspace
檔案,就可以輕鬆的使用第三方庫了。
Principle
為什麼我們執行這幾條指令就可以使用第三方庫了?
首先我們注意到,用 Cocoapods 安裝第三方庫後,不再開啟原工程檔案,而是開啟一個.workspace
的檔案。實際上在
Cocoapods 為我們安裝第三方庫的過程中,它做了如下幾件事:
- 將目的第三方庫以 target 的方式匯入
- 將這些 target 組合成一個名為 Pods 的工程
- 生成 libPods.a 靜態庫供原工程使用
- 原工程和第三方庫生成的 Pods 工程組合成新的
.workspace
Podfile
Podfile 就是用來描述一個或者多個 Xcode 工程中 targets 和第三方庫的依賴關係。預設情況下只在使用者工程的第一個 target中生效。
1. 多個 target 共用依賴 Pods
以兩個 target 分別為 MyApp1 和 MyApp2 為例,用link_with
即可。
platform :osx, '10.7'
link_with 'MyApp1', 'MyApp2'
pod 'AFNetworking', '~> 2.0'
pod 'Objection', '0.9'
|
2. 多個 target 依賴不同 Pods
第一個名為 MyApp1 的 target 依賴於 ObjectiveSugar 和 Artsy+UILabels,第二個名為 MyApp2 的 target 依賴於 OCMock。
platform :ios, '8.0' target :MyApp1 do pod 'ObjectiveSugar', '~> 0.5' pod 'Artsy+UILabels', '~> 1.0' end target :MyApp2 do pod 'OCMock', '~> 2.0.1' end |
3. 關於版本
可以不寫版本,也可以指定某個版本,當然也可以使用一些邏輯運算子。
'> 0.1'
比 0.1 高的所有版本'>= 0.1’
高於或者等於 0.1 的所有版本'< 0.1’
低於 0.1 的所有版本'<= 0.1'
低於或者等於 0.1 的所有版本
CocoaPods 中有個特殊的邏輯運算子 ~>
:
'~> 0.1.2’
包含 0.1.2 這個版本,最高不超過 0.2,不包括 0.2 或者更高版本'~> 0.1’
包含 0.1 這個版本,最高不超過 1.0,不包括 1.0 或者更高版本'~> 0’
版本 0 或者更高,和沒寫一樣。
更多關於版本的相關資訊和規則,下方擴充套件閱讀:
Podfile.lock
Issue
很多人都有一種困惑,從 GitHub 行 clone 下來別人的工程,看 Podfile 中對 AFNetworking
這個第三方庫的描述是這樣
pod "AFNetworking", '~> 2.5.2'
|
而經過
pod search afnetworking
|
發現當前最新的版本已經是 2.5.6
這時當你在專案目錄下執行了
pod install
|
按理說應該安裝 2.6.0 版本以內的最近版本,也就是 2.5.6,實際上發現還是安裝了 2.5.2 ,這就是 Podfile.lock 存在的意義。
Necessity
假如沒有 Podfile.lock,那麼在團隊開發中絕對是一種災難。假設 A 君和 B 君在協作開發同一個專案。A君作為這個專案的建立者,在 Podfile 中對AFNetworking
的描述是
pod "AFNetworking", '~> 2.5.2'
|
當 B 君 check out 這個專案時,AFNetworking
這個庫已經更新到了
2.5.5,那他在
pod install
|
之後,他本地的這個專案就會依賴於 2.5.5 版本的 AFNetworking
。如果這幾代版本更迭修改了一些方法的名稱,那專案裡將會各種
error。
很多人會說,那直接鎖定某個版本的AFNetworking
,不就不會出現這個問題了?但是開源庫的優化是隨時進行的,同時還伴隨修復
Bug 等操作,所以鎖定某個版本的行為是不可取的。
好在有 Podfile.lock,在 A 君第一次執行
pod install
|
之後,會在 Podfile.lock 中生成如下描述
PODS: - AFNetworking (2.5.2): - AFNetworking/NSURLConnection (= 2.5.2) - AFNetworking/NSURLSession (= 2.5.2) - AFNetworking/Reachability (= 2.5.2) - AFNetworking/Security (= 2.5.2) - AFNetworking/Serialization (= 2.5.2) - AFNetworking/UIKit (= 2.5.2) - AFNetworking/NSURLConnection (2.5.2): - AFNetworking/Reachability - AFNetworking/Security - AFNetworking/Serialization - AFNetworking/NSURLSession (2.5.2): - AFNetworking/Reachability - AFNetworking/Security - AFNetworking/Serialization - AFNetworking/Reachability (2.5.2) - AFNetworking/Security (2.5.2) - AFNetworking/Serialization (2.5.2) - AFNetworking/UIKit (2.5.2): - AFNetworking/NSURLConnection - AFNetworking/NSURLSession DEPENDENCIES: - AFNetworking (~> 2.5.2) SPEC CHECKSUMS: AFNetworking: fefbce9660acb17f48ae0011292d4da0f457bf36 COCOAPODS: 0.38.2 |
這時 B 君 check out 此專案之後,執行
pod install
|
Cocoapods 會安裝在 Podfile.lock 中描述的版本,而不會按照 Podfile 中的邏輯運算安裝最新的 2.5.5 。
在協同開發的時候,記得要一併同步 Podfile.lock,它會保證在 Podfile 中描述邏輯允許的情況下,鎖定安裝 Podfile.lock 描述中的版本。
只有在
pod update
|
之後,才會檢查最新的版本,並且重寫 Podfile.lock 中對第三方庫的版本描述。
通常情況下,我們無必要手動修改 Podfile.lock 中的內容,但是將它從.gitignore
中移除是十分必要的。
Q & A
一些可能遇到的問題和對應的解決答案,我踩過的坑,你就別踩了。
Q1: 用 gem 安裝 Cocoapods 提示 gem 版本過老怎麼辦
A1: 請升級 gem
$ sudo gem update --system
|
Q2: 如何升級 Cocoapods 的版本?
A2: 升級 Cocoapods 的版本其實和安裝是一樣的
$ sudo gem install cocoapods
|
Q3: 多個版本的 Cocoapods 如何解除安裝?
A3: 終端輸入
$ gem list
|
如果你安裝(也可能是升級導致)了多個版本的 Cocoapods,本例中如圖,安裝了 0.38.2 和 0.36.3 兩個版本。想解除安裝其中的舊版本,0.36.3
$ sudo gem uninstall cocoapods
|
選擇 1,更低的版本就被解除安裝掉了。
或者直接執行如下命令,老版本的都都被解除安裝了。
$ sudo gem clean
|
Q4: 我怎麼搜尋不到某個第三方庫的最新版本?
A4:可能是你的 Cocoapods 的版本低或者你本地的依賴庫 tree 較舊所致。參見 Q2 和 pod
setup
的使用。
Q5: 錯誤ERROR: While executing gem … (Gem::FilePermissionError) You don’t have write permissions for the /Library/Ruby/Gems/2.0.0 directory
A5: 這個錯誤往往出現在安裝 Cocoapods 或者刪除某個版本的 Cocoapods 的情況下,簡單粗暴就是修改許可權
sudo chmod 777 /Library/Ruby/Gems/2.0.0
|
Q6: 為什麼 Pods 匯入成功了但是無法引用標頭檔案?
A6: Cocoapods 把第三方庫以多個 target 形式組成一個名為 Pods 的工程,編譯為靜態庫,所以我們其實可以像引用系統框架一樣來引入他們的標頭檔案。
#import <AFNetworking>
|
如果一定要使用雙引號的形式,那就設定目標專案 target 中的 User Header Search Paths,雙擊此選項,新增一個${SRCROOT}
的鍵,值設定為recursive
,這樣就可以遞迴搜尋全部目錄。