CocoaPods

0x00 前言

这篇文章是自己在学习 CFHipsterRef Chapter 16 CocoaPods 时做的笔记。

0x01 Using CocoaPods

作为使用者和一个库的作者,CocoaPods 都是非常容易上手的。安装只需要几分钟的时间。

0x01 Installing CocoaPods

通过 RubyGems 安装 CocoaPods,RubyGems 是一个标准的 OS X 安装的 Ruby 包管理器,

打开 Terminal.app 并输入下面命令安装:

1
$ sudo gem install cocoapods

现在你应该就可以在终端中使用 pod 命令了。

0x02 Managing Dependencies

一个依赖管理器将软件需求列表解析为特定标签列表,以下载并集成到项目中。

0x0201 Podfile

Podfile 是列出项目的依赖项的地方。它相当于使用 Bundler 或 package 的 Ruby 项目的 Gemfilejson 用于使用 npm 的 JavaScript 项目。

要生成一个 Podfile,cd 到你的 .xcodeproj 文件所在的目录然后输入以下命令:

1
$ pod init

Podfile

1
2
3
4
5
platform :ios, '7.0'

target "AppName" do

end

依赖项可以有不同级别的规范。对于大多数的库,将它们包括进你的项目中绑定到一个次版本或补丁版本是最安全和最简单的方法。

1
pod 'X', '~> 1.1'

要包括一个为包括到公共 specs 数据库的库,可以使用 Git,Mercurial 或 SVN 仓库,可以指定一个 commitbranchtag

1
pod 'Y', :git => 'https://github.com/NSHipster/Y.git', :commit => 'b4dc0ffee'

一旦指定了所有的依赖项,它们就使用以下命令安装:

1
$ pod install

当运行这个命令的时候,CocoaPods 将会递归分析每个项目的依赖关系,将它们解析为依赖图,并序列化为 Podfile.lock 文件。

CocoaPods 会创建一个新的 Xcode 项目,为每个依赖项创建静态库 target,然后将它们链接一起到一个 libPods.a target 中。这个静态库变成你原始项目的一个依赖项。一个 xcworkspace 文件被创建并且应该从此时开始使用。这允许原始的 xcodeproj 文件保持不变。

随后调用的 pod install 会根据锁定的依赖图添加新的 pods 或 删除旧的 pods。要更新一个项目单独的依赖项到最新的版本,可以使用以下命令:

1
$ pod update

0x03 Trying Out a CocoaPod

一个很棒但是鲜为人知的 CocoaPods 的功能是 try 命令,其允许你在添加一个库到你的项目之前测试这个库。

使用在公共 specs 数据库中的一个项目的名称调用 $ pod try 打开库的任何示例项目:

1
$ pod try Ono

0x04 Creating a CocoaPod

作为 Objective-C 软件分发的事实标准,CocoaPods 是开源项目的一个要求,目的是被其他人使用。

花几分钟时间创建一个 .podspec 文件至少可以节省每个用户尝试将其集成到他们自己的项目中的时间。

记住:提高软件生态系统中的贡献标准降低了参与的标准。

0x0401 Specification

.podspec 文件是 CocoaPods 依赖的原子单位。它指定了一个库的名称,版本,license 和源文件,以及其他元数据。

NSHipsterKit.podspec

1
2
3
4
5
6
7
8
9
10
11
12
Pod::Spec.new do |s|
s.name = 'NSHipsterKit'
s.version = '1.0.0'
s.license = 'MIT'
s.summary = "A pretty obscure library. You've probably never heard of it."
s.homepage = 'http://nshipster.com'
s.authors = { 'Mattt Thompson' =>
'mattt@nshipster.com' }
s.social_media_url = "https://twitter.com/mattt"
s.source = { :git => 'https://github.com/nshipster/NSHipsterKit.git', :tag => '1.0.0' }
s.source_files = 'NSHipsterKit'
end

一旦发布到公共 specs 数据库,任何人都可以将其添加到自己的项目中:

Podfile

1
pod 'NSHipsterKit', '~> 1.0'

.podspec 文件也可以用于组织内置或私有依赖项:

1
pod 'Z', :path => 'path/to/directory/with/podspec'

0x05 Publishing a CocoaPod

虽然它开始工作地非常出色,但在 GitHub 上使用 Pull Requests 管理新的 pods 的过程变得很琐碎,对于库的作者和 spec 组织者来说都是。有时 podspecs 会不传递 $ pod lint 而提交,导致 specs repo 构建失败。其他时候,来自原始库作者意外的人的劣质提交会意外地打乱事情。

CocoaPods Trunk 服务,在 CocoaPods 0.33 中引入,解决了很多问题,使这个过程的对所有参与者都很好。作为一个集中式服务,它还具有能够获取库使用分析以及其他指标的好处。

要开始使用,你必须先使用 Trunk 服务注册你的机器。这非常简单,只需要指定你的 email 地址(那个你用来提交库代码的)以及你的名称。

1
$ pod trunk register mattt@nshipster.com "Mattt Thompson"

现在,将代码发布到 CocoaPods 只需要一个命令。同一个命令适用于创建新库或向现有库中添加新版本:

1
$ pod trunk push NAME.podspec

0x06 A Look Forward

CocoaPods 例证了社区基础设施的复合效应。在短短几年内,Objective-C 社区已经变成了我们可以成为一部分而感到自豪的东西。

CocoaPods 对于 Objective-C 是一个好东西。只会越来越好。