使用CocoaPods管理Xcode工程的第三方依赖

Yeolar   2015-01-02 10:52  

CocoaPods可以用来管理Xcode工程的依赖库。工程的全部依赖在一个叫Podfile的文本文件中指定。然后CocoaPods会自动解决库之间的依赖,下载源代码,链接等工作。

安装CocoaPods

CocoaPods是用Ruby开发的,可以通过系统自带的Ruby来安装。

1 # gem install cocoapods
2 $ pod setup             # 创建~/.cocoapods/repos

pod setup 会克隆 https://github.com/CocoaPods/Specs 的主分支,保存在本地。

官方源延迟较大,可以先更换为国内的源:

1 $ gem sources -l
2 $ gem sources -r https://rubygems.org/
3 $ gem sources -a http://ruby.taobao.org/

向Xcode工程中添加Pods

首先在Xcode中用通常方式创建一个新工程。然后打开终端,进入到工程目录。

创建一个 Podfile ,添加依赖:

1 platform :ios, '6.0'            # 第一行指定平台和版本
2 pod 'AFNetworking', '~> 2.0'
3 pod 'ObjectiveSugar', '~> 0.5'

执行 pod install ,然后使用 *.xcworkspace 打开工程,编译。

以后每次更改Podfile,记得要执行 pod update

Podfile.lock

这个文件用来记录和锁定安装的各个Pod的版本。即使有新的版本,执行 pod install 也不会更新。只有在Podfile中更新或执行 pod update 时,才会更新。以此来避免意外更新。

这个文件应该处于版本控制中。

查找第三方库

pod 和其他的包管理器类似,所以也可以通过查找来寻找需要的库。比如执行下面的命令看看:

1 $ pod search json

更多关于Podfile的内容

Podfile会创建一个名叫 default 的目标,链接到工程的第一个目标文件上。

一个比较复杂的Podfile可以是这样:

 1 source 'https://github.com/CocoaPods/Specs.git'
 2 
 3 platform :ios, '6.0'
 4 inhibit_all_warnings!
 5 
 6 xcodeproj 'MyProject'
 7 
 8 pod 'ObjectiveSugar', '~> 0.5'
 9 
10 target :test do
11     pod 'OCMock', '~> 2.0.1'
12 end
13 
14 post_install do |installer|
15     installer.project.targets.each do |target|
16         puts target.name
17     end
18 end

如果想在多个目标文件(比如还有个test)上链接这些Pod,可以:

1 platform :osx, '10.7'
2 
3 link_with 'MyApp', 'MyApp Tests'
4 pod 'AFNetworking', '~> 1.0'
5 pod 'Objection', '0.9'

Pod的版本

可以不写版本,这样会使用最新的Pod。或者像下面这样指定版本:

1 pod 'Objection', '0.9'

版本还可以控制范围:

  • '> 0.1' 高于0.1的版本
  • '>= 0.1' 0.1或者高于0.1的版本
  • '< 0.1' 低于0.1的版本
  • '<= 0.1' 0.1或者低于0.1的版本
  • '~> 0.1.2' 0.1.2和高于0.1.2低于0.2的版本,不包括0.2和更高版本
  • '~> 0.1' 0.1和高于0.1低于1.0的版本,不包括1.0和更高版本
  • '~> 0' 0和更高版本,和不写等效

此外还可以使用 :head ,这会使用最新代码。

如果版本发生了冲突,可以通过在前面单独加Pod指定的办法来解决。

Pod的代码位置

除了默认使用CocoaPods的源之外,还可以指定使用本地的代码:

1 pod 'AFNetworking', :path => '~/dev/AFNetworking'

注意目录下要有 .podspec 文件。

或者使用其他的源:

1 # 使用master分支
2 pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
3 # 使用另外的分支
4 pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
5 # 使用一个tag分支
6 pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
7 # 使用某个提交的版本
8 pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '082f8319af'

这种方法需要注意依赖的问题,比如能够满足其他Pod对该Pod的依赖。

同样需要有 .podspec 文件。

私有Pod

私有Pod提供了一种方式,可以方便地在不同项目之间共享组件。如果想维护自己的Pod,可以选择使用私有Pod。

首先创建自己的Spec库。并不需要fork官方的 CocoaPods/Specs 主库,只要路径可以访问就行。库的结构需要是这样:

.
├── Specs
    └── [SPEC_NAME]
        └── [VERSION]
            └── [SPEC_NAME].podspec

然后添加你的私有库:

1 $ pod repo add REPO_NAME SOURCE_URL
2 $ cd ~/.cocoapods/repos/REPO_NAME && pod repo lint .  # 检查一下是否成功

现在私有库就已经创建完了,接下来添加私有Pod。

Pod由 .podspec 文件来描述,可以这样创建一个新的 .podspec 文件:

1 $ pod spec create <POD_SPEC_NAME>

~/.cocoapods/repos/master/ 是一个git库,其中 Specs 目录下包含了大量的Pod,可以参考这里面的来写自己的。

向私有库添加 .podspec ,注意先给源打上标签,生成版本。

1 $ pod repo push REPO_NAME SPEC_NAME.podspec
2 $ pod spec lint

最后在Podfile中使用。只需加上该源:

1 source 'URL_TO_REPOSITORY'

http://www.yeolar.com/note/2015/01/02/cocoapods/

http://www.yeolar.com/note/2015/01/02/cocoapods/