CocoaPods管理Xcode项目的library dependencies(依赖库)。
项目的 dependencies(依赖项) 在一个名为 Podfile 的文本文件中指定。CocoaPods 将解析库之间的dependencies(依赖关系),获取生成的源代码,然后将其链接到Xcode工作区中以构建项目。
CocoaPods的最终目的是通过创建一个更加集中的生态系统来提高第三方开源库的可发现性和参与度。
安装CocoaPods
CocoaPods 是用 Ruby 构建的,可以用 macOS 上的默认 Ruby 安装。你也可以使用 Ruby 版本管理器,但是建议你使用 macOS 上提供的标准 Ruby。
使用默认的 Ruby 安装需要在安装 gems 时使用 sudo。
1 | $ sudo gem install cocoapods |
Sudo-less installation
如果您不想为此过程授予 RubyGems 管理员权限,则可以通过如下2种方法来告诉 RubyGems 安装到你的用户目录中:
方法一:
1 | $ gem install cocoapods --user-install |
方法二:
打开终端并使用首选编辑器创建或编辑 ~/.bash_profile,然后将以下行输入到文件中:
当然不同的 macOS 版本可能是编辑 ~/.zshrc,我们推荐使用方案二。
1 | export GEM_HOME=$HOME/.gem |
更新 CocoaPods
要更新CocoaPods,只需再次安装gem
1 | $ [sudo] gem install cocoapods |
或者更新到预发布版本
1 | $ [sudo] gem install cocoapods --pre |
如果您最初使用 sudo 安装cocoapods gem,那么应该再次使用sudo。
稍后,当您通过安装pods来积极使用CocoaPods时,当CocoaPods X的新版本可用时,你将收到通知。
使用 CocoaPods
开始之前,检查Specs仓库 或 cocoapods.org,以确保您要使用的库可用。
创建 Podfile
Podfile 是一种规范(或者明细单),它描述了一个或多个Xcode项目的 targets 的 dependencies。 该文件应简单地命名为Podfile。
切换到项目根目录,使用如下命令创建 Podfile 文件:
1 | $ pod init |
将 dependencies 添加到单个 targets
1 | target 'MyApp' do |
链接app和它的测试包
1 | source 'https://github.com/CocoaPods/Specs.git' |
多个 targets 使用同一个 pods,请使用 abstract_target
1 | # There are no targets called "Shows" in any Xcode projects |
Podfile的根目录下有一个隐式抽象target,因此您可以将上面的示例编写为:
1 | pod 'ShowsKit' |
关于 Podfile 语法可学习 Podfile Syntax Reference
pod install
1、pod install vs pod update
1 | $ pod install |
pod install是在您第一次要为项目检索pods时使用,也每次在编辑Podfile以添加,更新或删除pod时使用,它不会尝试更新已安装pod的版本。- 当你想将
pods更新到较新版本时,才使用pod update [PODNAME]。
2、pod install的作用
每次运行
pod install命令(即下载并安装新的pods)时,它都会为每个pod中将安装的版本写入Podfile.lock文件中。该文件跟踪每个pod的安装版本,并锁定这些版本。当运行
pod install时,它只解决尚未在Podfile.lock文件中列出的pod的dependencies(依赖关系).
对于 Podfile.lock 中列出的Pod,它将下载Podfile.lock中列出的显式版本,而不会尝试检查是否有更新的版本
对于尚未在Podfile.lock中列出的Pod,它将搜索与Podfile中描述的相匹配的版本
关于 pod install 更详细的可学习 pod install vs. pod update
pod outdated
当运行 pod outdated时,CocoaPods将列出所有pods,这些 Pod 具有比 Podfile.lock(当前为每个Pod安装的版本)中列出的版本更高的版本。 这意味着,如果您在这些 pods 上运行 pod update PODNAME,它们将被更新,只要新版本仍与 Podfile 中设置的 pod'MyPod','〜> x.y' 之类的限制相匹配。
pod update
当您运行pod update PODNAME时,CocoaPods将尝试查找Pod PODNAME的更新版本,而不考虑Podfile.lock中列出的版本。 它将把Pod更新到可能的最新版本(只要它与Podfile中的版本限制匹配)。
如果您运行没有Pod名称的 pod update,CocoaPods会将Podfile中列出的每个Pod更新为可能的最新版本。
提示
一般我们的策略是不将 Pods 文件夹提交到共享 repository 中,但是你应始终提交并推送Podfile.lock文件。
否则,将破坏上面解释的关于pod install能够锁定您的pod安装版本的整个逻辑。
Pods 和 Submodules
CocoaPods 和 git submodules(子模块)试图解决非常相似的问题。两者都努力简化在项目中包含第三方代码的过程。Submodules(子模块)链接到该项目的特定提交,而CocoaPod绑定到版本化的开发人员版本。