CocoaPods -- 发布自己的组件仓库

369 阅读7分钟

前言: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、SnapKitYYKit等等。使用这些库的时候通常需要:

  • 下载开源库的源代码并引入工程
  • 向工程中添加开源库使用到的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 项目中。

  1. 第三方库会被编译成 .a 静态库或者 .framwork 的动态链接库供我们真正的工程使用。

    CocoaPods 会将所有的第三方库以 target 的方式组成一个名为 Pods 的工程,该工程就放在刚才新生成的 Pods 目录下。整个第三方库工程会生成一个名称为 libPods.a 的静态库供我们的工程使用。

    对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在项目每次编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。

  2. 原来的工程设置已经被更改了,这时候我们直接打开原来的工程文件去编译就会报错。我们的工程和第三方库所在的 Pods 工程会被以一个新生成的 workspace 的形式组织和管理,方便我们直观的管理工程和第三方库。

  3. CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。

四.CocoaPods 的核心组件

CocoaPods 是用 Ruby 写的,并划分成了若干个 Gem 包。

与 CocoaPods 相关的两个目录(/Library/Ruby/Gems):

  1. ~/.CocoaPods/repos/:这个目录存储远端的 podspec 文件到本地。master 是所有第三方的 podspec 索引文件。其它的是我们自定义的 podspec 索引文件。
  2. ~/Library/Caches/CocoaPods/:这个目录就是缓存文件的存储目录。

CocoaPods 在解析执行过程中最重要的几个包的路径分别是:CocoaPods/CocoaPods、CocoaPods/Core 和 CocoaPods/Xcodeproj。

  1. CocoaPods/CocoaPods:这是面向用户的组件,每当执行一个 pod 命令时,这个组件将被激活。它包括了所有实用 CocoaPods 的功能,并且还能调用其它 Gem 包来执行任务。
  2. CocoaPods/Core:Core Gem 提供了与 CocoaPods 相关的文件(主要是 Podfile 和 Podspecs)的处理。
    1. Podfile:该文件用于配置项目所需要的第三方库,它可以被高度定制。
    2. Podspecs:该文件描述了一个库将怎样被添加进工程中。.podspec 文件可以标识该第三方库所需要的源码文件、依赖库、编译选项,以及其他第三方库需要的配置。
  3. 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 中的一项或者是两项来校验通过。

  1. 提交代码,推送至远端,并给代码打标签。
  2. 至此,已经完成了一个版本的Pod创建。接下来如果需要法恩祥这个组件,让其他人可以使用你的组件,需要将其添加到pod spec repo。可以在github上创建一个仓库,并推送这个pod组件工程,也可以创建私有的pod仓库。
  3. 创建私有仓库的命令: pod repo add HiinternPodSpecs {remote path}。需要关联一个远程新建的仓库地址。
  4. 将pod推送到私有repo上命令 pod repo push HiinternPodSpecs xxx.podspec --private --allow-warnings.
  5. 至此,完成了pod的分享使用。(如果只是修改被人的pod,在完成2,3,4,5后,只需要执行9即可)