说在前面
CocoaPods项目的源码 在 Github 上管理。项目始于 2011 年 8 月,几年来已成为 iOS 开发事实上的依赖管理标准工具。几乎每个iOS 开发者都用过CocoaPods管理三方库,可大多数人真的就是“只是会用”,甚至不知道CocoaPods也是GitHub上一开源项目。本文从CocoaPods官网取材,来多方面介绍一下CocoaPods,疏漏之处还请大家多多指正。
一、入门
1. 什么是 CocoaPods
CocoaPods为您的Xcode项目管理库依赖关系。
项目的依赖项在Podfile文本文件中指定。CocoaPods将解析库之间的依赖关系,获取生成的源代码,然后在 Xcode workspace 中将其链接在一起来构建项目。
最终目标是通过创建一个更集中的生态系统来提高第三方开源库的可发现性和参与度。
2. 安装 CocoaPods
CocoaPods是用Ruby构建的,mac系统上原装Ruby。
具体安装过程可看唐巧的文章用CocoaPods做iOS程序的依赖管理
$ sudo gem install cocoapods
3. pod install vs. pod update
不只是CocoaPods,这几乎是别的依赖管理器的通用命令,如bundler, RubyGems 和composer。
命令 | 执行时机 |
---|---|
pod install |
安装新的pods。即使之前有Podfile文件并执行过pod install命令 ; 增、删cocoapod都需要重新执行pod install命令。 |
pod update [PODNAME] |
只有将pods更新到较新版本时才使用,不指定则默认更新所有。 |
1. pod install
首次拉取pods
,每次更改Podfile文件来增、删、改一个pod
,都会用到此命令。
-
每次
pod install
命令执行,会下载并安装新的pods
,还会在Podfile.lock文件中写入每个加载的pod
的版本信息,Podfile.lock文件会追踪并锁定这些pods
的版本。 -
运行pod install命令时,
-
Podfile.lock已经列出来的
pods
,只会下载Podfile.lock文件中指定的版本,不会检查更新。 -
Podfile.lock没有列出来的
pods
,会搜索并下载与Podfile文件描述(pod 'MyPod', '~>1.2'
)匹配的版本的pod
。
2. pod outdated
列出所有比Podfile.lock文件中指定的版本有更新版本的pod,即一旦执行pod update
,这些列出来的更新版本只要是符合Podfile描述的都会被下载更新。
3. pod update
运行pod update PODNAME
,CocoaPods将抛开Podfile.lock,尝试搜寻更新版本的pod PODNAME
,将pod
更新为最新版本(符合Podfile描述的情况下)。
pod update
将默认更新所有pods
。
事实上是pod install pod update
- 都可以增删pod,完全按照Podfile描述进行操作。
- 在更新版本上有区别,
pod install只有在pod当前版本不符合Podfile描述时进行必要更新以符合Podfile描述;
pod update则是在符合Podfile描述情况下更新到最新版本;
每次pod版本有变动,Podfile.lock文件内容便会有相应的更新。 - 间接依赖问题。
二、使用Cocoapods
1. Podfile.lock文件的作用
-
Podfile.lock文件在第一次运行
pod install
\pod update
后生成,并跟踪记录每个被安装的pod的版本。 -
在Podfile.lock文件的作用下,在不同的时间机器上运行
pod install
会得到相同的pod版本,即使有更新的版本可用。 -
除非在Podfile中更新依赖关系或被
pod update
调用(这将导致新的Podfile.lock生成),CocoaPods将保持各Pod 对应Podfile.lock文件中的版本不变。这样CocoaPods避免了由依赖关系的意外更改引起的头痛。
2. CocoaPods 在背后干了什么
在Xcode中,直接从ruby源代码中引用它:
-
创建或更新workspace。创建Podfile文件,
pod install
\pod update
后根目录下会生成 .xcworkspace工作空间文件。 -
CocoaPods 将 project 添加到 workspace。
-
CocoaPods 将 CocoaPods 静态库 project 添加到 workspace
-
将libPods.a添加到: targets => build phases => link with libraries.
-
将CocoaPods Xcode配置文件添加到应用程序的项目中。
-
将您的应用程序的目标配置更改为基于CocoaPods的。
-
添加构建文本将资源从您安装的pod复制到应用程序包即所有其他构建阶段之后的“脚本构建阶段”,具体如下:
- shell: /bin/sh
- Script: ${SRCROOT}/Pods/PodsResources.sh
三、Podfile
Podfile是描述一个或多个Xcode项目的目标依赖关系的规范。该文件应该被简单地命名Podfile.
1. 指定pod版本
除了没有版本或特定的版本,还可以使用逻辑运算符:
- '> 0.1' 任何版本高于0.1
- '>= 0.1' 版本0.1和任何更高版本
- '< 0.1' 任何版本低于0.1
- '<= 0.1' 版本0.1和任何较低版本
除了逻辑运算符CocoaPods有一个宽泛的运算符~>:
- '~> 0.1.2' 版本0.1.2,版本高达0.2,不包括0.2及更高版本
- '~> 0.1' 版本0.1,版本高达1.0,不包括1.0及更高版本
- '~> 0' 版本0及更高版本,这基本上与没有它相同。
2. 引用本地pod文件
pod 'Alamofire', :path => '~/Documents/Alamofire'
3. 指定加载特定标签的pod
- 使用masterrepo 的分支:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'
- 使用repo的不同分支:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'
- 要使用repo的标签:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'
- 指定一个提交:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'
网友评论