[TOC]
# 1. 將 Pods 添加到 Xcode 項目
在你開始之前
1. 檢查 [Specs 庫](https://github.com/CocoaPods/Specs) 或 [cocoapods.org](https://cocoapods.org/) 以確保您想要使用的庫可用。
1. 在你的電腦上[安裝 CocoaPods](https://guides.cocoapods.org/using/getting-started.html#toc_3)。
## 1.1 安裝
1. 創建一個 [Podfile](https://guides.cocoapods.org/using/the-podfile.html),并添加您的依賴關系:
~~~
target 'MyApp' do
pod 'AFNetworking', '~> 3.0'
pod 'FBSDKCoreKit', '~> 4.9'
end
~~~
3. 在項目目錄中運行 `pod install`。
4. 打開 App.xcworkspace 并構建。
# 2. 用 CocoaPods 創建一個新的 Xcode 項目
要使用CocoaPods創建一個新項目,請遵循以下簡單步驟:
1. 像通常一樣在 Xcode 中創建一個新項目。
2. 打開終端窗口,并 `cd` 到您的項目目錄。
3. 創建一個 Podfile。 這可以通過運行 `pod init` 來完成。
4. 打開你的 Podfile。 第一行應指定支持的平臺和版本。
~~~
platform :ios, '9.0'
~~~
5. 為了使用CocoaPods,你需要定義Xcode目標來鏈接它們。 例如,如果你正在編寫一個iOS應用程序,它將是你的應用程序的名稱。 通過編寫目標 `$ TARGET_NAME` 創建一個目標部分,然后幾行之后添加 `end` 。
6. 通過在目標塊內的單行上指定 `pod'$ PODNAME'` 來添加 CocoaPod。
~~~
target 'MyApp' do
pod 'ObjectiveSugar'
end
~~~
7. 保存你的Podfile。
8. 運行 `pod install`
9. 打開創建的 MyApp.xcworkspace 。 這應該是您每天用來創建應用程序的文件。
# 3. 與現有 workspace 集成
將 CocoaPods 與現有的工作空間集成需要在你的 Podfile 中增加一行。 只需在目標塊外部指定 .xcworkspace 文件名,如下所示:
~~~
workspace 'MyWorkspace'
~~~
# 4. 何時使用 pod install 與 pod update?
很多人對何時使用 pod install 以及何時使用 pod update 感到困惑。 尤其是,他們經常使用 pod update,而不是使用 pod install。
您可以在[本專用指南](https://guides.cocoapods.org/using/pod-install-vs-update.html)中找到有關何時使用每種命令的詳細說明以及每個命令的預期用法。
# 5. 我應該將 Pods 目錄遷入到源代碼控制嗎?
您是否遷入 Pods 文件夾取決于您,因為工作流程因項目而異。 我們建議您將 Pods 目錄保持在源代碼管理下,并且不要將其添加到 .gitignore 中。 但最終這個決定取決于你:
## 5.1 遷入Pods目錄的好處
* 克隆倉庫之后,即使沒有在機器上安裝 CocoaPods,項目也可以立即生成并運行。 沒有必要運行 `pod install`,并且不需要 Internet 連接。
* Pod 工件(代碼/庫)始終可用,即使 Pod(例如GitHub)的源停止工作。
* 在克隆倉庫之后,Pod 工件保證與原始安裝中的相同。
## 5.2 忽略Pods目錄的好處
* 源代碼控制倉庫將更小,占用更少的空間。
* 只要所有 Pod 的源代碼(例如 GitHub)可用,CocoaPods 通常都可以重新創建相同的安裝。 (從技術上講,不能保證在 Podfile 中不使用提交 SHA 時,運行 `pod install` 將獲取并重新創建相同的工件,在 Podfile 中使用 zip 文件時尤其如此。)
* 執行源代碼控制操作時不會出現任何沖突,例如合并具有不同 Pod 版本的分支。
無論您是否遷入 Pods 目錄,Podfile 和 Podfile.lock 都應始終保持在版本控制之下。
# 6. 什么是 Podfile.lock ?
此文件在第一次運行 `pod install` 后生成,并跟蹤已安裝的每個 Pod 的版本。 例如,想象在 Podfile 中指定的以下依賴項:
~~~
pod 'RestKit'
~~~
運行 `pod install` 將安裝當前版本的 RestKit,從而生成一個 Podfile.lock,指出安裝的確切版本(例如 RestKit 0.10.3)。 感謝 Podfile.lock,在稍后的時間點在另一臺計算機上對此假設項目運行 pod install,即使有更新的版本可用,仍然會安裝 RestKit 0.10.3。 除非在 Podfile 中更新依賴項或調用了 `pod install`(這將導致生成新的Podfile.lock),否則 CocoaPods 將遵循 Podfile.lock 中的 Pod 版本。 通過這種方式,CocoaPods 避免了因依賴關系發生意外更改而導致的頭痛。
Google提供了一個很棒的視頻,介紹它的工作原理: ["CocoaPods and Lockfiles (Route 85)"](https://www.youtube.com/watch?v=H-zK1mEwTe0)
# 7. 幕后發生了什么?
在 Xcode 中,直接從[ ruby 源代碼](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/installer/user_project_integrator.rb#L61-L65)引用,它:
1. 創建或更新 [workspace](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/installer/user_project_integrator.rb#L82) 。
2. 如果需要,將您的項目添加到 workspace 。
3. 如果需要,[將 CocoaPods 靜態庫項目添加到工作區](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/installer/user_project_integrator.rb#L88-L94)。
4. 將libPods.a添加到:[targets => build phases =>link with libraries](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/installer.rb#L385-L393)。
5. 將 CocoaPods [Xcode 配置文件](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/installer/user_project_integrator/target_integrator.rb#L112)添加到您的應用程序項目中。
6. 將應用的[目標配置](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb#L46-L73)更改為基于 CocoaPods 的配置。
7. 添加構建階段以從安裝到應用包的任何Pod中[復制資源](https://github.com/CocoaPods/CocoaPods/blob/master/lib/cocoapods/installer/user_project_integrator/target_integrator.rb#L145)。 即在所有其他構建階段之后的“Script build phase”,具有以下內容:
* Shell: `/bin/sh`
* Script: `${SRCROOT}/Pods/PodsResources.sh`
請注意,如果 CocoaPods 靜態庫已經在您的項目中,則跳過步驟3。 這主要基于 Jonah Williams 在[靜態庫](http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4)上的工作。
# 8. Pod 和子模塊
CocoaPods 和 git 子模塊試圖解決非常類似的問題。 都努力簡化在您的項目中包含第三方代碼的過程。 子模塊鏈接到該項目的特定提交,而 CocoaPod 綁定到版本化的開發人員版本。
## 8.1 從子模塊切換到 CocoaPods
在決定完全轉換到 CocoaPods 之前,請確保您當前使用的庫都是可用的。記錄當前使用的庫的版本也是一個好主意,這樣您就可以設置 CocoaPods 使用相同的庫。這也是一個好主意,以增量的方式,處理依賴而不是一個大的移動。
1. 如果你還沒有安裝 CocoaPods,請安裝
2. 創建你的 Podfile
3. [刪除子模塊引用](http://davidwalsh.name/git-remove-submodule)
4. 在 Podfile 中添加對已移除庫的引用
5. 運行 `pod install`