1. 程式人生 > >Cocoapods 的安裝、使用及其配置

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,這樣就可以遞迴搜尋全部目錄。