前言:CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 86 thousand libraries and is used in over 3 million apps. CocoaPods can help you scale your projects elegantly. 这是cocoapods官网的介绍,翻译成中文,也就是swift和OC工程的项目管理依赖,类似于andriod的Gradie。
一.为什么需要CocoaPods?
在进行iOS开发的时候,总免不了使用第三方的开源库,比如本项目中用到的 Alamofire、SnapKit、YYKit等等。使用这些库的时候通常需要:
- 下载开源库的源代码并引入工程
- 向工程中添加开源库使用到的framework
- 解决开源库和开源库以及开源库和工程之间的依赖关系、检查重复添加的framework等问题
如果我们用cocoapods去集成这些第三方开源库时,这些繁杂的工作就不再需要我们亲力亲为了,只需要我们做好少量的配置工作,CocoaPods会为我们做好一切! 使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。
二.安装CocoaPods
CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境。因为Mac电脑自带Ruby环境,我们就只需打开终端开始动手。然而又因为默认情况下我们mac系统自带的Ruby环境版本比较低(大概是2.0.0或者其他较高版本),但是现在安装CocoaPods需要2.2.2版本及以上的,所以我们不管三七二十一先直接先升级ruby。
打开终端:>_
1、查看当前Ruby版本
ruby -v
结果如下,或者你的可能是其它版本,没关系继续往下操作
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20]
2、安装rvm,我们要通过rvm来安装Ruby
curl -L get.rvm.io | bash -s stable
source ~/.bashrc
source ~/.bash_profile
3、查看rvm版本
rvm -v
显示如下(或者是其他版本)
rvm 1.29.12 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
4、列出ruby可安装的版本信息
rvm list known
显示如下
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.10]
[ruby-]2.5[.8]
[ruby-]2.6[.6]
[ruby-]2.7[.2]
[ruby-]3[.0.0]
ruby-head
.....
5、安装Homebrew
已安装的可跳过,遇到报错请参看文章开头的重点说明
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
6、安装ruby, 建议选择最新的3.0.0版本
rvm install 3.0.0
7、更换源
sudo gem update --system
///这一步建议是先执行后续用到了再添加
///例如,你使用Fastlane进行自动化部署这个是需要的
gem sources --remove https://rubygems.org/
gem sources --add https://gems.ruby-china.com/
8、验证你的Ruby镜像是并且仅是ruby-china
gem sources -l
如果是以下结果说明正确
*** CURRENT SOURCES ***
https://gems.ruby-china.com/
9、开始安装CocoaPods
sudo gem install -n /usr/local/bin cocoapods
10.在安装进程结束的时候,执行命令:
$ pod setup
如果没有报错,就说明一切安装就成功了!
三.CocoaPods 的原理
CocoaPods 的原理是将所有的依赖库都放到另一个名为 Pods 的项目中,然后让主项目依赖 Pods 项目,这样就把源码管理工作从主项目移到了 Pods 项目中。
-
第三方库会被编译成 .a 静态库或者 .framwork 的动态链接库供我们真正的工程使用。
CocoaPods 会将所有的第三方库以 target 的方式组成一个名为 Pods 的工程,该工程就放在刚才新生成的 Pods 目录下。整个第三方库工程会生成一个名称为 libPods.a 的静态库供我们的工程使用。
对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在项目每次编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。
-
原来的工程设置已经被更改了,这时候我们直接打开原来的工程文件去编译就会报错。我们的工程和第三方库所在的 Pods 工程会被以一个新生成的 workspace 的形式组织和管理,方便我们直观的管理工程和第三方库。
-
CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。
四.CocoaPods 的核心组件
CocoaPods 是用 Ruby 写的,并划分成了若干个 Gem 包。
与 CocoaPods 相关的两个目录(/Library/Ruby/Gems):
~/.CocoaPods/repos/:这个目录存储远端的 podspec 文件到本地。master 是所有第三方的 podspec 索引文件。其它的是我们自定义的 podspec 索引文件。~/Library/Caches/CocoaPods/:这个目录就是缓存文件的存储目录。
CocoaPods 在解析执行过程中最重要的几个包的路径分别是:CocoaPods/CocoaPods、CocoaPods/Core 和 CocoaPods/Xcodeproj。
- CocoaPods/CocoaPods:这是面向用户的组件,每当执行一个 pod 命令时,这个组件将被激活。它包括了所有实用 CocoaPods 的功能,并且还能调用其它 Gem 包来执行任务。
- CocoaPods/Core:Core Gem 提供了与 CocoaPods 相关的文件(主要是 Podfile 和 Podspecs)的处理。
- Podfile:该文件用于配置项目所需要的第三方库,它可以被高度定制。
- Podspecs:该文件描述了一个库将怎样被添加进工程中。.podspec 文件可以标识该第三方库所需要的源码文件、依赖库、编译选项,以及其他第三方库需要的配置。
- CocoaPods/Xcodeproj:这个包负责处理工程文件,它能创建以及修改 .xcodeproj 文件和 .xcworkspace 文件。它也可以作为一个独立的包使用,当你要编写修改项目文件的脚本时,可以考虑使用 CocoaPods/Xcodeproj。
五.cocoapods在本项目中的应用
什么是Pod,Spec,PodRepo
pod原意是豆荚里的一粒豌豆,在项目中,可以理解为一个单独的功能模块,或者组件。
spec是podSpec的简称,podSpec或Spec描述了pod仓库的一个版本(可以理解为一个Spec对应了组件的一个git版本)。随着时间的推移,一个Pod会有很多的Spec。它包含了应该从哪里获取源,要使用什么文件、用应用的构建设置以及其他通用元数据(如源名称、版本和描述)的详细信息,存放在 xxx.podspec 文件内。
pod Repo是pod specs repo 的简称,相当于豌豆荚,是豌豆们的合集。在项目中,可理解为组成这些模块或者组件的一个集合,称为pod仓库(repository),这个仓库包含了很多Pod以及他们的版本(spec),Pod仓库本身也是一个工程文件,是需要使用git来管理的。
只有将pod组件的某一个Spec(版本)添加到Pod Repo中,才能被仓库所管理。
默认情况下,最新版本的Cocoapods会有一个
trunk的库,是github的pod仓库(现在是一个CDN服务器)。可以将自己的私有Pod仓库,比如我们目前项目中使用的HiinternPodSpecs
Pod & Git的相关命令
Pod组件需要使用Git来进行管理,以便于在创建Pod的某个版本是(也就是pod spec),可以很方便的在.podspec文件中制定Pod的Git版本。
以下将以实际的列子来使用这两者:
1.创建登录模块业务的相关Pod项目的命令:pod lib create HiinternLoginModule .其中lib意思为develop pods,意思是开发一个新的pod,默认情况下,会自动使用git作为版本管理,你无需进行git初始化,你可以选这是否带有个demo工程(推荐)。如果你需要和主工程链条,需要你在主工程podfile文件里面添加pod 'HiinternLoginModule',:path => "./{your path}/HiinternLoginModule",并在主工程目录下,终端执行pod install.
2.编写业务代码,知道相关的代码修改完成
3.编写 HiinternLoginModule.podspec 文件。具体参考Cocoapods官网。
4.校验你的仓库是否正确,在你的组件仓库目录下,终端输入 pod spec lint .当工程十分复杂时,可能会有多个小组件的.podspec,需要制定具体的。如果pod中应用了其他的pod,根据其来源,可能需要添加 --sources='xxx'和--private 中的一项或者是两项来校验通过。
- 提交代码,推送至远端,并给代码打标签。
- 至此,已经完成了一个版本的Pod创建。接下来如果需要法恩祥这个组件,让其他人可以使用你的组件,需要将其添加到pod spec repo。可以在github上创建一个仓库,并推送这个pod组件工程,也可以创建私有的pod仓库。
- 创建私有仓库的命令:
pod repo add HiinternPodSpecs {remote path}。需要关联一个远程新建的仓库地址。 - 将pod推送到私有repo上命令
pod repo push HiinternPodSpecs xxx.podspec --private --allow-warnings. - 至此,完成了pod的分享使用。(如果只是修改被人的pod,在完成2,3,4,5后,只需要执行9即可)