[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`