添加 pods 到 Xcode 工程
開始之前請先做兩件事情:
- 搜索 Specs 倉庫或者 cocoapods.org 確認想要安裝的庫存在;
- 電腦上已經安裝 CocoaPods。
安裝到現有工程
創建 Podfile 文件,添加依賴:
target 'MyApp' do
pod 'AFNetworking', '~> 3.0'
pod 'FBSDKCoreKit', '~> 4.9'
end
- 在工程目錄下執行
pod install
- 打開并編譯
MyApp.xcworkspace
創建一個新的工程并集成 CocoaPods
創建一個新的工程并集成 CocoaPods,步驟如下:
- 創建一個普通的 Xcode 工程;
- 打開終端,
cd
到工程目錄; - 創建
Podfile
文件,這可以通過執行pod init
來完成; - 打開
Podfile
文件,第一行必須制定使用的平臺和版本;
platform :ios, ‘9.0’
- 你需要指定 Xcode 的 target。如果是 iOS App target 就是 工程的名稱。通過
target '$TARGET_NAME' do
代表 target 的開始,end
表示結束; - 在 target 的范圍內使用
pod '$PODNAME'
添加 pod
target 'MyApp' do
pod 'ObjectiveSugar'
end
- 保存
Podfile
; - 執行
pod install
; - 將工程通過
MyApp.xcworkspace
打開.
集成已經存在的 workspace
集成 CocoaPods 到已經存在的 .workspace
工程,需要在 Podfile
中 ,targe 范圍外,添加一行:
workspace 'MyWorkspace'
pod install
和 pod update
使用時機
很多人會疑惑 pod install
和 pod update
應該在什么時候用,經常是在本應該用 pod install
的時候使用了 pod update
。
你可以在這里找到它們詳細的說明。
是否應該將 Pods 目錄加入版本控制
是否將 Pods 加入版本控制,需要看情況而定。官方建議把 Pods 目錄加入版本控制,不要把它加入 .gitignore
,不過最終還是看你自己決定:
加入版本控制的好處
- 倉庫克隆完畢,可以立即編譯運行,即使沒有安裝 CocoaPods。不需要執行
pod install
,也不用網絡連接。 - pod 對應的庫總是可用的,即使 pod 的源碼無法獲取了。
- 能夠保證克隆下來的 pod 庫同安裝和編譯它的人版本一致。
忽略版本控制的好處
- git 倉庫會占用的空間少。
- 只要 Pod 源代碼還在,總是能夠通過
pod install
重新安裝原先的版本。 - 可以避免在合并分支的時候出現 Pod 源碼版本不一致的沖突。
不管是否將 pods 目錄加入版本庫, Podfile
和 Podfile.lock
是一定要加入版本控制的。
什么是 Podfile.lock
?
它會在第一次執行 pod install
的時候生成,并且跟蹤已經安裝的 pod 的版本。例如,假設 Podfile
中有如下依賴:
pod 'RestKit'
執行 pod install
會安裝當前最新的版本,并生成 Podfile.lock
文件記錄該版本號(比如說:RestKit 0.10.3
)。之后在其它機器上,即使 RestKit
有了新的版本,這個工程目錄下執行 pod install
安裝的仍舊是 0.10.3 版本。除非修改 Podfile
中指定的版本或者執行 pod update
否者 Podfile.lock
會保證 pods 的版本不變。
這里有一個 Google 介紹它是如何工作的視頻 CocoaPods and Lockfiles (Route 85).
背后的實現
在 Xcode 中,可以直接查看 CocoaPods 的ruby 源代碼。
- 創建或者更新 workspace。
- 添加你的工程到 workspace。
- 添加 CocoaPods 的靜態庫到 workspace。
- 添加 App-Pods.framework 到 targets => build phases => link with libraries。
- 添加 CocoaPods 的 Xcode 配置文件到工程。
- 根據 CocoaPods 來修改 app target 配置
- 添加一個 build phase 腳本來將 pods 中的資源文件拷貝到 app bundle 中 ,在 build phase 的最后面添加
Copy Pods Resource
:- Shell: /bin/sh
- ${SRCROOT}/Pods/PodsResources.sh
步驟3中如果工程中原本有靜態庫就直接跳過。