CocoaPods是一个用来帮助我们管理iOS第三方依赖库的工具。在CocoaPods出现之前,我们在使用第三方库的时候通常做法是直接将第三方库源码拖入项目中直接使用或者设置成git的submodule。这种做法会有一些问题,比如一个第三方库又依赖了一些系统的或其他的framework,我们就需要手动的将这些依赖补齐,这比较麻烦并且没有什么技术含量。CocoaPods的出现解决了这些问题,我们只需要关注要引入的第三方库,然后使用Podfile文件将其引入,执行
pod install
,一切搞定。
文章分为上下两篇,上篇主要说下安装使用和原理,下篇是私有库的搭建和使用。
1、安装
CocoaPods是用Ruby构建的,要想使用它首先需要有Ruby的环境。可以直接使用MAC的OS X提供的默认Ruby来安装,具体的执行命令操作如下:
$ sudo gem install cocoapods
$ pod setup
- 执行完install命令半天没反应
Ruby的软件源是https://rubygems.org/
,使用的亚马逊的云服务,由于种种原因我们是无法访问的,但是我们可以通过更换Ruby源的方式解决这个问题。之前的解决方案是使用国内淘宝的源https://ruby.taobao.org/
,但是这个站点已经不再继续维护了,为了正常使用我们还是使用下边的设置吧:
$ gem sources --remove https://rubygems.org/
$ gem sources -a https://gems.ruby-china.com
上边操作完成后,可以执行下边的命令查看是否替换成功。
$ gem sources -l
正常的输出是:
*** CURRENT SOURCES ***
https://rubygems.org/
- gem版本过老
gem是管理Ruby库和程序的标准包,如果它的版本过低也可能导致安装失败,解决方案自然是升级gem,执行下述命令即可:
$ sudo gem update --system
- pod setup等待时间太久
pod setup
在执行时,CocoaPods会将托管在https://github.com/CocoaPods/Specs上面的所有项目的Podspec文件更新到~/.cocoapods/目录下,这个文件很大,所有第一次更新会非常慢。方法是直接手动下载到本地,操作如下:
$ git clone https://code.aliyun.com/Magi/CocoaPods.git ~/.cocoapods/repos/master --progress
2、使用
2.1 创建Podfile文件
在Xcode项目的根目录下执行命令创建Podfile
文件,操作如下:
$ pod init
Podfile文件的格式如下:
source 'https://github.com/CocoaPods/Specs' #源的下载地址
platform :ios, '7.0' #支持的ios系统最低版本
pod 'SDWebImage', '~> 4.3.3' #第三方库以及版本号
target 'XXApp' do #项目的target
# use_frameworks!
end
注意:
- 用CocoaPods导入swift第三方库时必须要用
use_frameworks!
。 - 使用
use_frameworks!
表示打包成.framework
库使用,否则将打包成.a
静态库使用。
2.2 安装依赖库
Podfile
文件创建完成后,在当前的工程目录下,执行命令来安装依赖库:
$ pod install
2.3 更新依赖库
当依赖的第三方库升级新版本后,一般使用pod update
命令来更新第三方库
- 全部更新
如果要将所有依赖第三方库更新到Podfile
的指定版本,需要执行命令如下:
$ pod update
在执行pod update
后,会把制定的第三方库更新到x.x.x~x.(x+1).0
之间的最新版本,举个例子,pod 'SDWebImage', '~> 4.3.3'
,要使用的是4.3.3到4.4.0之间的最新版本。如果Podfile里边是这样指定第三方库的版本号,那么每次pod update
都可能会更新依赖库,对于需要保证稳定开发的App来说可能是不利的,我们可以通过直接指定版本号(pod 'SDWebImage', '4.3.3'
)的方式来避免这个问题。
直接执行pod update
命令,首先会去更新本地.cocoapods/repos/master
目录下的spec仓库,这个仓库比较大每次都更新比较费时,可以通过追加参数避免更新直接更新依赖库,命令如下:
$ pod update --no-repo-update
这种做法会存在一些问题,比如你的本地spec仓库比较老,这时更新的依赖库可能就不是GitHub上面对应第三方库的最新版本,可能一些bug的修复和新功能就没办法及时修补和使用。
- 更新指定库
如果想只更新某个依赖库,可以在pod update
后面加上库名,如下:
$ pod update [LIB_NAME] #库的名称
2.4 查找第三方库
如果想要查找某个第三方库或者查看某个第三方库的最新版本,可以使用如下命令:
$ pod search [LIB_NAME] #库的名称
2.5 Podfile.lock作用
在开始使用CocoaPods,执行完pod install
之后,会生成一个Podfile.lock
文件,每次执行pod update
也会更新Podfile.lock
文件。Podfile.lock
文件最大的作用在于多人开发时,保证团队中每个人使用的依赖库的版本一致。
Podfile.lock
是第一次pod install时生成的,Podfile.lock
里面会标注当前项目依赖库的指定版本,这样在多人协同开发的时候,别人同步了你的podfile.lock
文件后,他执行pod install
就会安装podfile.lock
中的指定版本依赖库,保证了大家使用依赖库版本的一致性,避免不一致带来的开发问题。Podfile.lock
应该纳入版本控制之下。但是Podfile.lock
并不是一成不变的,当修改了Podfile
文件,执行pod update
时,就会更新Podfile.lock
文件。
pod update
你会根据Podfile
文件的规则更新所有依赖库,不会理睬现有的Podfile.lock
,而是根据安装依赖库的情况生成新的Podfile.lock
文件
3、原理
3.1 下载原理
当使用CocoaPods导入第三方库时,CocoaPods首先会根据第三方库的git地址去找到git仓库,找到后根据tag(就是pod 'SDWebImage', '~> 4.3.3'
所指定的第三方库版本)去找对应版本的提交(如果没有指定版本,那么会找最后一次的提交),然后在这次提交中检索后缀为.podspec
的文件。找到后首先会验证s.name
是否与Podfile
中指定的第三方库名是否一致,不一致则会报[!] Unable to find a specification for 'SDWebImage'.
的错误。验证成功后根据s.source_files
找到需要导入的源文件和相关资源文件和配置文件等,最后将其下载到本地项目中。
3.2 集成原理
CocoaPods会把所有下载到本地项目的所有第三方库通过Pods项目来进行管理,这样第三方库的管理工作通过CocoaPods转移给了Pods项目,主项目只要依赖Pods项目,所有的使用就变得一目了然。Pods项目最终会编译成一个名为libPods.a
的文件,主项目只需要依赖这个文件即可。对于资源文件,CocoaPods提供了一个名为Pods-resources.sh
的bash脚本,该脚本在每次项目编译的时候都会执行,将Pods依赖库的各种资源文件复制到目标文件中,还通过Pods.xcconfig
文件在编译时设置所有依赖和参数。
网友评论