Cocoapods系列(一)使用篇

对于做iOS开发的绝大多数开发者而言,Cocoapods 并不陌生。无论是日常开发,还是编写 Dome,时常用到 Cocoapods 来管理库文件的依赖。

笔者之前也只是停留在用 Cocoapods 导入第三方库而已,由于对于组件化学习的深入和发布自己的代码库的需求,于是有了该系列的文章,来梳理 Cocoapods 使用过程中的一些细节。

网络上也有大量关于 Cocoapods 安装、替换镜像的文章,在此也不再累赘描述。

本文将会着重讲解Podfile文件以及pod命令行

关于Cocoapods的工作原理可见笔者另一篇博文。

简单的使用

就比如我们最常用的AFNetworking来说的话,只需在项目名.xcodeproj的目录下创建一个Podfile的文件,然后打开文件,填入一下内容:

1
2
3
4
target 'target name' do
use_frameworks!
pod 'AFNetworking'
end

然后保存,并且打开一个命令行,跳转到Podfile的目录直接运行pod install即可。 当然,你会看到你的目录下回多了目录Pods, 文件Podfile.lock以及文件项目名.xcworkspace。以后你打开项目就再也不是xcodeproj的文件了,而是wxcworkspcace的文件。然后你打开项目就会看到除了你的项目外,下面多了一个Pods的一个项目。

就此,对于你项目需要依赖的AFNetworking的依赖了。非常简单对吧? 如果你只是想简单的使用Cocoapods,估计到这一步就完全够了。

Podfile.lock文件

在执行完pod install之后,会生成一个Podfile.lock文件。这个文件看起来跟我们关系不大,实际上绝对不应该忽略它。

该文件用于保存已经安装的Pods依赖库的版本,通过CocoaPods安装了AFNetworking依赖库以后对应的Podfile.lock文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PODS:
- AFNetworking (3.1.0):
- AFNetworking/NSURLSession (= 3.1.0)
- AFNetworking/Reachability (= 3.1.0)
- AFNetworking/Security (= 3.1.0)
- AFNetworking/Serialization (= 3.1.0)
- AFNetworking/UIKit (= 3.1.0)
- AFNetworking/NSURLSession (3.1.0):
- AFNetworking/Reachability
- AFNetworking/Security
- AFNetworking/Serialization
- AFNetworking/Reachability (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Serialization (3.1.0)
- AFNetworking/UIKit (3.1.0):
- AFNetworking/NSURLSession
DEPENDENCIES:
- AFNetworking
SPEC CHECKSUMS:
AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67
PODFILE CHECKSUM: 023cc304232df5f2f4cbc2ab8d90949d95b41a34
COCOAPODS: 1.3.1

Podfile.lock文件最大得用处在于多人开发。

对于没有在Podfile文件中指定Pods依赖库版本的写法,如下:

1
pod 'AFNetworking'

该句话用于获取当前AFNetworking这个Pods依赖库的最新版本。

当团队中的某个人执行完pod install命令后,生成的Podfile.lock文件就记录下了当时最新Pods依赖库的版本,这时团队中的其它人从Git拉取下来这份包含Podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的Pods依赖库的版本就和最开始用户获取到的版本一致。如果没有Podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的AFNetworking,这就有可能造成同一个团队使用的依赖库版本不一致。

这对团队协作来说绝对是个灾难!

但是当执行pod update命令时,将会忽略Podfile.lock文件AFNetworking更新至最新版本,那么仍有可能导致同一个团队使用的依赖库版本不一致。

若是既想保持依赖库保持最新版本,又想团队中依赖库版本保持一致,在这种情况下,笔者认为最优的方案:

  • 更改Podfile文件,使其指向最新版本的AFNetworking依赖库pod 'AFNetworking', '~> 3.1.0';
  • 执行pod update命令;

Podfile文件

pod

首先先来讲讲最核心的pod关键字吧。关于pod的使用在上面可以看得出来是pod '框架名' 参数。 当然对于前面两个pod '框架名'是固定的,没上面好说,参数的话,这里主要讲参数。

参数一: 版本号

版本号可以是大于、小于、等于等。当然具体的可以是’> 3.7’, ‘>= 3.7’, ‘< 3.7’, ‘3.7’以及’~> 3.7’。关于普通的就没什么好说了,最后一个~>指的是正对最后一位来说。如使用’~> 3.7.4’,意味着’>= 3.7.4’并且’< 3.8.0’的意思。

参数二:地址

Cocoapods可以指定某一个git的目录或者是本地的目录。有的时候我们希望一直用某一个版本最新的版本,即使没有打版本的话,我们可以直接后面接上:git => 'https://github.com/gowalla/AFNetworking.git'

当然除了这种情况外,还有可能是如果是我们自己开发的私有库,并且在开发阶段的情况下,可能就希望开发模式进行引用,则可以使用path参数::path => '~/Documents/AFNetworking'

具体使用可见笔者Cocoapods系列另一篇博文《Cocoapods系列(三)私有篇》

参数三:tag、branche、commit

有的时候我们希望引用有一个tagbranch或者是comit的内容的话可以使用这个参数,分别用:branch => 'branch名':tag => 'tag名':commit => '提交号'

参数四:inhibit_warnings => true

对于强迫症患者而言,一个项目中很多warnings是非常难以忍受的。自然这个参数是用来避免那些第三方框架中带来的warnings。用法:inhibit_warnings => true

platform

这个参数是只依赖的库希望在哪个平台被编译。 一句话带过吧,直接使用platform :ios, '9.0'。需要注意的是如果在platform后面没有跟东西的话,默认是在iOS4.3,OSX 10.6,tvOS 9.0以及watchOS 2.0的情况下编译的。很多库都是从6.0或者7.0才开始支持的,肯能会造成编译不通过。

target

这个是指定具体的配置是适配在哪个target,这里的target值得就是Xcode中的target。如果对于一些项目中你的不同target引用的框架不同的话,可以采用这个进行区分。

比如创建项目时勾选了TestsUITests,那么必须声明是那个target导入的依赖库。

use_frameworks!

这个指明编译成动态库,而不是静态库。

Podfile中的 use_frameworks!一文中详细的描述了use_frameworks用法。

source

这个参数是指Cocoapods从哪些仓库(Spec)中获得框架的源代码,如果在结合使用开源库以及自己私有库的情况下,这个参数还是非常有意义的。博主之前在用到自己私有库的情况下就不懂这点,最后查了好久资料才知道的。只需要在Podfile文件开头列出你需要引用库的所有仓库地址即可。

1
2
source 'https://github.com/artsy/Specs.git'
source 'https://192.168.0.90:8888/MySepcs/Specs.git'

Podfile Demo

对于Podfile常用几个关键字拿出来说了一下,如果还有更深入不懂的情况下,可以查看Cocoapods Guide。 最后给一个官方的Demo吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# open source
source 'https://github.com/CocoaPods/Specs.git'
# my work
source 'https://github.com/Artsy/Specs.git'
target 'App' do
pod 'Artsy+UIColors'
pod 'Artsy+UIButtons'
pod 'FLKAutoLayout'
pod 'ISO8601DateFormatter', '0.7'
pod 'AFNetworking', '~> 2.0'
target 'AppTests' do
pod 'FBSnapshotTestCase'
pod 'Quick'
pod 'Nimble'
end
end

命令行

在使用Cocoapods的过程中,我们可能要更新或者是安装一个新的第三方框架。自然这里就避免不了要用pod installpod update这两个命令了。

对于这两个命令来说,一个是在有新的第三方框架引入是运行,另一个是纯粹为了更新本地的第三框架。 对于二者的命令来说其参数都是大同小异的,这里大概讲解一下。

参数–no-repo-update

这个参数应该是大家最常用的参数之一,其主要的作用是用于在执行pod installpod update两条命令是而执行的pod repo update的操作。而pod repo update则是跟新本地已有的第三框框架。对于大多数情况下,我们只希望跟新当前项目的,并且这个操作执行的时间都是相对比较长,所以在执行这两条命令是,大多数人都添加了这个参数。

参数–verbose 和 –silent

这两个参数是用来控制pod命令的,而有些人不希望看到输出的情况下可以选择--silent。而对于在执行这两条命令的情况下如果出错了,则可能添加--verbose的参数能看到具体的出错信息。--verbose则是用来输出这两条命令执行过程中所包含的所有信息。对于大多数的Cocoapods的命令行来说都带有着两个参数。

其他的细节就不具体说了,大家可以通过help命令来进行查看详情。

常用命令行集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 创建默认的 Podfile
$ pod init
// 第一次使用安装框架
$ pod install
// 安装框架,不更新本地索引,速度快
$ pod install --no-repo-update
// 今后升级、添加、删除框架,或者框架不好用都使用这个命令
$ pod update
// 更新框架,不更新本地索引,速度快
$ pod update --no-repo-update
// 搜索框架
$ pod search XXX
// 帮助
$ pod --help
终端命令: control + C 取消上一次操作;

总结

简单来说要使用Cocoapods只需通过三个步骤:安装、写Podfilepod install命令即可。

但是对于一个有理想的大好青年来说,绝不会止步于此。

本着为人类伟大的开源主义事业奋斗终身的目标,以及加入热火朝天的组件化开发浪潮的目的。

Cocoapods系列后续文章将以这两个目标和目的展开,分享如何在一个项目同时使用私有库和开源库,以及如何进行组件化管理。