CocoaPods 是iOS开发中最常使用的依赖管理工具,可以提高我们平时开发集成一些三方库的效率,和更方便的实践组件化的开发模式;cocoaPod可以省去工程配置时间,对后续的三方库、私有库等的版本迭代管理也很便利;
CocoaPods的基础使用
在工程目录下生成Podfile
文件后,通过执行pod install
把文件内添加的组件集成进APP。pod install
完成后,这些组件都放在一个Pods的工程中,之后通过xcode的workspace来管理pod工程和我们自己的工程。
第一次运行pod install
时, .xcworkspace项目
和Pods目录
还不存在, pod install
命令运行完成后,这些就都会被创建;
区分pod install 与 pod update
我们在使用这个工具时,最经常用到的命令就是pod install
和 pod update
;这两个命令都能为我们安装指定的Pod库,但是他们的使用略有区别,有各自不同的适用场景;
了解这两个命令的差异前,需要先对Podfile.lock
文件有所了解;
-
Podfile.lock
文件中记录了每个pod的当前已安装版本,并锁定这些版本(.lock命名因此而来); - 当运行
pod install
命令时,它只解析尚未列在Podfile.lock
中的依赖库,在下载并安装新的pod时, 会在Podfile.lock
文件中写入新的pod库的当前指定版本; - 对于已经在
Podfile.lock
中列出的pod,pod install
命令不会尝试检查是否有更新的版本;而是直接使用在Podfile.lock
文件中的pod版本;
pod install 适合使用的场景
- 通常在项目刚创建并使用CocoaPods时,通过这个命令安装指定的pod库,并生成相应的工程配置;
- 其次在
Podfile
中 增加 或 删除 某个pod后, 通常也会通过执行pod install
命令来完成更新;pod install不会尝试更新已安装的pod库的版本;
pod update 适合使用的场景
1、当运行pod update
时,CocoaPods会把Podfile中所有的pod库 都更新到指定tag的最新引用版本;并在Podfile.lock
中写入最新的版本号;也就是我们需要对引用的库做更新时(如三方库更新了内容修复了某个bug等等情况),使用这个命令完成依赖版本的更新
2、执行pod update PodName
命令更新指定的某个PodName
库到最新版本;
pod outdated
pod outdated
命令可以检测出所有比Podfile.lock
中写入的版本(每个pod当前安装的版本)更新的pod版本;
cocoapods创建开放组件库
1、podspec文件
.podspec 文件描述了一个库是怎样被添加到工程中的。它支持的功能有:列出源文件、framework和lib、编译选项和某个库所需要的依赖等。
通过~/.cocoapods/repos
路径查看 本地中心仓库文件夹,会发现保存的都是podspec文件;当我们执行pod search PODNAME
命令时,cocoapods会查找 本地中心仓库文件夹 中已有的podspec文件,如果匹配到PODNAME
库,就会列出所有release 版本;
2、为开源项目创建podspec文件
我们可以为自己的开源项目创建podspec文件,在工程目录下通过如下命令初始化一个podspec文件:
pod spec create mySpecFile
end
执行该命令后,CocoaPods 会生成一个名为mySpecFile.podspec
的文件,然后我们修改其中的相关内容即可,以下是一个podspec文件的例子:
Pod::Spec.new do |s|
s.name = 'QLMutilTableView'
s.version = '1.0.0'
s.summary = '多表的实现'
s.homepage = 'https://www.jianshu.com/p/589fcc1d22b9'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'qianlei' => '[email protected]' }
s.source = { :git => '//https://github.com/qianleileilei/QLMutilTableView.git', :tag => 1.0.0 }
s.ios.deployment_target = '9.0'
s.source_files = 'QLMutilTableView/QLMutilTableView/**/*'
s.frameworks = 'UIKit', 'Foundation'
end
之后可以通过如下命令验证podspec
文件是否有错误或警告:
pod spec lint your_podspec_name.podspec
如果验证不通过,会有详细的ERROR和WARING提示,可根据提示信息进行修改;验证通过后,使用以下命令把podspec文件推送到Cocoapods官方repo源:
pod trunk push your_podspec_name.podspec
这一步完成后,再次更新下本地的repo中心仓库,这个podspec文件就可以在我们本地的repo中心仓库中检索到了;第三方使用者也可以通过在Podfile
文件中添加pod 'PodName'
引用到这个开源库了;
3、添加git仓库作为私有中心仓库
直接在~/.cocoapods/repo目录下面创建一个目录MyPrivateSpec
,放自己的podspec,这里需要符合cocoapods对中心代码库的文件结构树的规定:
- 在~/.cocoapods/repo 目录下创建
MyPrivateSpec
- 在
MyPrivateSpec
文件夹下创建YourProjrctName
- 在
YourProjrctName
文件夹下创建1.0.0
版本号- 在
1.0.0
版本文件夹下放入 对应的podspec文件- 把
MyPrivateSpec
用git托管,推送到git server上
这个时候就可以共享这个私有的中心仓库了,其他人如果更新了本地repo仓库(通过以下命令添加了repo仓库):
pod repo add reponame [email protected]: MyPrivateSpec.git
就可以通过pod search YourProjrctName
搜索到共享的开源库了;
如果需要把自己私有库的podspec
文件推送到对应的私有仓库上,可以通过以下命令实现(这之前还是需要先对podspec文件做下校验):
pod repo push [MyPrivateSpec] MePods.podspec --allow-warnings
Cocoapods原理部分
CocoaPods 使用Ruby语言编写,Podfile
文件的语法也遵循Ruby的语法;CocoaPods通过把所有的依赖库都放到 Pods 子项目下,然后通过xcode的workspace来管理这个pod工程和我们自己的工程;
Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目其实最终只依赖了这个 .a 文件;
以下是pod install
的内部执行流程:
- 查看 ~/.cocoapods/repo/master/Specs 是否存在当前需要的依赖
- 存在,从这个本地三方库信息库中获取 Podfile 中对应三方库的 git 地址
- 不存在,输出 Setting up CocoaPods Master repo,并拉取三方库信息库到 ~/.cocoapods/repo/中
- 使用 git 命令从 GitHub 上拉取 Podfile 中对应的三方库源码
关于pod install
过程更深入的了解还可以看这里,通过这条命令的执行过程,基本可以了解到CocoaPods
内部的主要逻辑;