在CocoaPods中使用自定义的第三方库

发表于:, 更新于:, By Rm1210
大纲
  1. 1. 一. podspec文件介绍
  2. 2. 二. 创建一个podspec文件
  3. 3. 三. 安装podspec
  4. 4. 四. 某些文件禁用ARC
  5. 5. PS:
  6. 6. PPS:

CocoaPods作为最流行的Objective-C第三方库管理工具,相信很多同学都已经用上了。

今天和大家分享一下如何用CocoaPods管理官方没有收录的第三方库。

一. podspec文件介绍

在CocoaPods中每一个第三方库对应一个podspec描述文件,该文件描述了这个库的名称,版本,许可证,主页,作者,摘要,源码位置,平台,所依赖的其他库(包括其他第三方库以及系统的Framework),是否使用ARC等信息。

官方收录的所有第三方库的podspec文件都托管在 https://github.com/CocoaPods/Specs。当我们刚安装完CocoaPods执行

1
$ pod setup

的时候,CocoaPods便会把所以收录的库的podspec文件clone到 ~/.cocoapods 目录中。当我们执行

1
2
$ pod list
$ pod search

命令的时候,便是搜索位于~/.cocoapods目录中的所有第三方库。所以我们只要构造一个符合标准的podspec文件放在~/.cocoapods文件夹中,便可以被pod搜索到,也就可以用pod来安装和管理了。

二. 创建一个podspec文件

下面通过我参与的项目中一个真实案例来学习相关的概念。

项目中要使用到了一个我自己Fork的库OEGridView.我们先来创建一个podspec文件:

1
$ pod spec create OEGridView

该命令会生成一个名为 OEGridView.podspec的文件。用你喜欢的编辑器打开该文件,可以看到注释已经非常详尽了。把注释都删掉,留下我需要的字段:

1
2
3
4
5
6
7
8
9
10
11
Pod::Spec.new do |s|
s.name = "OEGridView"
s.version = "1.0.0"
s.summary = "Core Animation based grid view."
s.homepage = "https://github.com/OpenEmu/OpenEmu/"
s.author = { "CrazyCatcher" => "zhanxcyy@gmail.com" }
s.source = { :git => "https://github.com/pphelpermac/OEGridView.git" }
s.source_files = '*.{h,m}'
s.framework = 'QuartzCore'
s.requires_arc = true
end

便得到了一个简单而又管用的podspec文件。

三. 安装podspec

接下来的问题是这个podspec文件该放在哪里。我们当然可以按照一定的规矩直接拷贝的~/.cocoapods 目录下面

1
~/.cocoapods/repos/custom-podspec/OEGridView/1.0/OEGridView.podspec

但是这样子不利于团队协作。我们可以把所以我们自定义的库做成一个repo,托管在Github上面,像我所要用的自定义库的podspec我都托管在https://github.com/pphelpermac/Podspecs.
这样,我们就可以用CocoaPods的命令来安装我们自己的repo啦:

1
pod repo add PPHelper-Podspecs https://github.com/pphelpermac/Podspecs.git master

这样安装的结果就是把我们的repo clone到~/.cocoapods目录下面,不过这样我们的teammate或者其他人如果想用这个repo,就可以很方便地用一句命令来安装了。

四. 某些文件禁用ARC

我们的repo安装好之后就可以在podfile中引用该库了:

1
pod 'OEGridView'

一路pod install或者pod update之后,Build一下。咦,怎么报错了。

原来OEGridView库中的 NSColor+OEAdditions文件是不用ARC的。

对于一个采用ARC的库,podspec文件中会声明requires_arc字段为true;当其中有一些文件不想采用ARC时,可以将这些文件声明为exclude_files,然后把这些文件作为一个subspec,subspec中的requires_arc字段赋值为false就可以解决ARC库中单独文件不采用ARC的问题了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Pod::Spec.new do |s|
s.name = "OEGridView"
s.version = "1.0.0"
s.summary = "Core Animation based grid view."
s.homepage = "https://github.com/OpenEmu/OpenEmu/"
s.author = { "CrazyCatcher" => "zhanxcyy@gmail.com" }
s.source = { :git => "https://github.com/pphelpermac/OEGridView.git" }
s.source_files = '*.{h,m}'
s.framework = 'QuartzCore'
non_arc_files = 'NSColor+OEAdditions/NSColor+OEAdditions.{h,m}'
s.requires_arc = true
s.exclude_files = non_arc_files
s.subspec 'no-arc' do |sna|
sna.requires_arc = false
sna.source_files = non_arc_files
end
end

还有一种方法是通过判断文件删除该文件的编译标识:

1
obj.settings.delete('COMPILER_FLAGS')

这种方法我没有尝试,试过的朋友可以分享下 :)

PS:

自从shell从bash换到zsh后,没有写过博文,所以今天才碰到这个问题:就是在zsh下运行:

1
rake new_post["custom-pod-in-cocoapods"]

会报错:

1
zsh: no matches found: new_post[custom-pod-in-cocoapods]

无法新建博文.

查找了一下原因是因为zsh会吧‘*’, ‘(’, ‘|’, ‘<’, ‘[’, or ‘?’识别为查找文件名的通配符.

解决方法有:

  • 输入 "rake new_post"后直接回车,octpress会询问新博文的名字,这时再输入博文名就OK了。

  • 用引号把"rake new_post"和博文名一起括起来:rake "new_post[custom-pod-in-cocoapods]"

PPS:

第一次写技术博文,还请大家多多指教 :D