Cocoapods的安装与基本使用

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
2
3
$ gem install cocoapods --user-install
# 查看cocoapods的安装目录
$ gem which cocoapods

方法二:
打开终端并使用首选编辑器创建或编辑 ~/.bash_profile,然后将以下行输入到文件中:

当然不同的 macOS 版本可能是编辑 ~/.zshrc,我们推荐使用方案二。

1
2
export GEM_HOME=$HOME/.gem
export PATH=$GEM_HOME/bin:$PATH

更新 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项目的 targetsdependencies。 该文件应简单地命名为Podfile

切换到项目根目录,使用如下命令创建 Podfile 文件:

1
$ pod init

将 dependencies 添加到单个 targets

1
2
3
4
target 'MyApp' do
use_frameworks!
pod 'Alamofire', '~> 3.0'
end

链接app和它的测试包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/Artsy/Specs.git'

platform :ios, '9.0'
inhibit_all_warnings!

target 'MyApp' do
pod 'GoogleAnalytics', '~> 3.1'

# Has its own copy of OCMock
# and has access to GoogleAnalytics via the app
# that hosts the test target

target 'MyAppTests' do
inherit! :search_paths
pod 'OCMock', '~> 2.0.1'
end
end

post_install do |installer|
installer.pods_project.targets.each do |target|
puts target.name
end
end

多个 targets 使用同一个 pods,请使用 abstract_target

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# There are no targets called "Shows" in any Xcode projects
# Xcode projects 中没有 targets 被称为 Shows
abstract_target 'Shows' do
pod 'ShowsKit'
pod 'Fabric'

# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do
pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do
pod 'ShowTVAuth'
end
end

Podfile的根目录下有一个隐式抽象target,因此您可以将上面的示例编写为:

1
2
3
4
5
6
7
8
9
10
11
12
pod 'ShowsKit'
pod 'Fabric'

# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do
pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do
pod 'ShowTVAuth'
end

关于 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 文件中列出的poddependencies(依赖关系).

对于 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 updateCocoaPods会将Podfile中列出的每个Pod更新为可能的最新版本。

提示

一般我们的策略是不将 Pods 文件夹提交到共享 repository 中,但是你应始终提交并推送Podfile.lock文件。

否则,将破坏上面解释的关于pod install能够锁定您的pod安装版本的整个逻辑。

Pods 和 Submodules

CocoaPods 和 git submodules(子模块)试图解决非常相似的问题。两者都努力简化在项目中包含第三方代码的过程。Submodules(子模块)链接到该项目的特定提交,而CocoaPod绑定到版本化的开发人员版本。

学习博客

CocoaPods.org

hchong * Cocoapods实践

QiShare * iOS模块化管理之CocoaPods实战

文章作者: Czm
文章链接: http://yoursite.com/2020/03/22/Cocoapods%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Czm