一,前言
-
为什么要用Cocopods
通常在开发的过程中,大多时候,我们会处理一类相同的操作,比如对于字符串String的邮箱验证,是否为空,手机号验证,或者一些UIView的动画操作,我们为了避免写一些重复的代码,可能经过类目或者延展的形式对原有的类进行了一个扩充。还有一些是工程中一些基本的公共组件,比如城市列表,刷新控件,网络请求库或者商品的目录这种基本公共组件,在工程中好多地方需要调用,我们都可以进行封装成一个组件功能模块。为了以后方便在其他App中使用,我们可以使用Cocoapods把这些小点子,小功能,可以封装成一个pod,当下次使用的时候,只需简单配置就可以了。这一点特别是在公司开发多个项目的时候,可以很方便快速的共享公共的代码,节约开发时间,这就是为什么好多公司喜欢组件化管理代码。至于库是创建私有的还是公共的,看自己和公司要求而定,大多情况下公司的是私有库pod。当然通过cocopods除了集成自己开发的功能模块外,还可以引用第三方发布到cocopods上的功能功能模块,比如友盟的分享,神策的统计等等好的功能模块。总之Cocopods 减少了代码的耦合性,提供了开发效率等等。
-
理解Cocopods原理
-
cocoapods的下载原理
举例: s.source = { :git => 'git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git', :tag => '1.0.0' } //s.source 位于.podspec内
当使用Cocoapods导入私有库时,Cocoapods先是根据:git => ‘git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git’找到对应的git仓库,然后根据:tag => ‘1.0.0’定位到对应tag的提交(如果没有注明Pod依赖库版本则定位到最后一次的提交),然后在这次提交中检索后缀为.podspec的文件(文件可以随便命名)。找到podspec文件后先要验证s.name是否与Podfile中的一致,如果不一致则install时会报错:[!]Unable to find a specification for ‘React’. 如果验证成功后,就会根据Podspec中的s.source_files找到需要导入的代码文件,并通过其他的的数据找到对应的配置文件或资源文件等。最后,将其下载到本地项目中。
当使用Cocopods导入共有库时,和以上原理也相同。只是共有库要将podspec文件上传到cocoapods。在导入的时候通过名字React去cocoapods匹配对应的podspec,然后根据s.source去找到对应的仓库和对应的版本,然后会再去匹配新的podspec,后边的步骤就完全相同了。 -
集成原理
当所有的依赖库都下载完后,Cocoapods会将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目。这样,源码管理工作都从主目录移到了Pods项目中。Pods项目最终会编译成为一个名为libPods.a的文件,主项目只要依赖这个.a文件即可。对于资源文件,Cocoapods提供了一个名为Pods-resource.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将Pods依赖库的各种资源文件复制到目标目录中。Cocoapods还通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。-
libPods.a
-
Pods-resources.sh
-
Pods.xcconfig
-
-
版本控制原理
当执行完pod install之后,cocoapods会生成一个podfile.lock的文件。podfile.lock文件最大的用处在于多人开发。如果你没有在podfile中指定pods版本pod ‘React’,那么默认为获取当前React依赖库的最新版本。当团队中的某个人执行完pod install命令后,生产的podfile.lock文件就记录下了当时最新pods依赖库的版本,这时团队中的其他人check下来这份包含podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的pods依赖库的版本和最开始用户获取到的版本一致。如果没有podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的React,这就可能造成一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难。
在这种情况下,如果团队想使用当前最新版本的React依赖库,有两种方案:
1、更改podfile,使其指向最新版本的React依赖库
2、执行pod update命令;鉴于podfile.lock文件对团队协作如此重要,所以应该加入到版本控制里面。 -
区分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的版本; -
pod update
1、当运行pod update时,CocoaPods会把Podfile中所有的pod都更新到最新版本;并在Podfile.lock中写入最新的版本号;
2、执行pod update PODNAME命令更新指定的某个PODNAME库到最新版本; -
pod outdated
pod outdated命令可以检测出所有比Podfile.lock中写入的版本(每个pod当前安装的版本)更新的pod版本;
-
-
-
了解Cocopods的本地目录
我们先来看看CocoaPods本地目录中有什么
-
$ cd ~/.cocoapods/repos/master 或者显示隐藏文件
-
$ defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder
然后进入 ~/.cocoapods/repos/master你会发现 master 是一个 git 仓库,输出仓库的远程地址,发现是一个GitHub仓库
-
$ git remote -v
origin https://github.com/CocoaPods/Specs.git (fetch) origin https://github.com/CocoaPods/Specs.git (push)
继续,我们进入Specs文件夹一直往里点,你会发现很多框架以及版本号
-
$ pod search YYImage
选择一个框架,通过pod搜索 Specs 文件夹中的框架,输出框架信息-> YYImage (1.0.4) Image framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more. pod 'YYImage', '~> 1.0.4' - Homepage: https://github.com/ibireme/YYImage - Source: https://github.com/ibireme/YYImage.git - Versions: 1.0.4, 1.0.3, 1.0.2, 1.0.1, 1.0, 0.9.5, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.9 [master repo] - Subspecs: - YYImage/Core (1.0.4) - YYImage/WebP (1.0.4)
每个版本号对应的一个json文件,描述了每个对应版本的框架的信息、配置、及源码下载地。
我们在 CocoaPods 发布我们的框架时,就是要在 master 仓库中添加我们的仓库描述信息,然后push到远程仓库中。不过这个过程不用我们手动去操作,只需要通过pod命令进行操作即可。
-
二,iOS 创建自己的Cocoapods公有库
- 注册 CocoaPods 账号 (已注册可忽略)
想创建开源的Pod库,就要注册一个CocoaPods账号,我们使用终端注册, email 用你的 GitHub 邮箱
$ pod trunk register GitHub_email 'user_name' --verbose
等终端出现下面文字,CocoaPods 会发一个确认邮件到你的邮箱上,登录你的邮箱进行确认。
[!] Please verify the session by clicking the link in the verification email that has been sent to you_email@163.com
注册成功!
确认后再终端输入
pod trunk me
可以看到你的注册信息
类似如下:
$ pod trunk me - Name: xxx - Email: xxx@163.com - Since: November 17th, 20:46 - Pods: None - Sessions: - November 17th, 20:46 - March 27th, 2020 19:44. IP: xxx.xxx.xxx.xxx
- 创建一个工程
1、在桌面上新建一个工程文件夹比如“cocopods”
2、打开终端,切换到该目录cd /Users/xxx/Desktop/cocopods
3、创建工程模板
pod lib create cocopods
4、配置相关选择。
-
选择平台
What platform do you want to use?? [ iOS / macOS ] iOS
-
选择语言
What language do you want to use?? [ Swift / ObjC ] ObjC
-
是否自动生成demo,选择Yes,方便以后测试
Would you like to include a demo application with your library? [ Yes / No ] Yes
-
是否集成测试框架
Which testing frameworks will you use? [ Specta / Kiwi / None ] None
-
UI 测试
Would you like to do view based testing? [ Yes / No ] No
-
指定类前缀 (当指定前缀时系统会自动在模版内创建指定前缀的类,Delegate)
What is your class prefix? LX
- 执行完之后,自动打开项目。
-
-
编写podspec文件。
1、 目录下文件介绍
-
podspec这个文件主要是用来描述项目名称、pod的版本号、介绍、首页(homepage)、作者信息、git源等,具体的可以参看官方Podspec Syntax Reference
-
README使用过GitHub的都会知道README文件的重要性,这个文件可以使用Markdown语法,主要展示在GitHub工程上的首页。README文件对于使用这个pod库的人来说,有和没有这个文件,区别是很明显的,此外这还有助于创建一个高质量的 CocoaPods Quality Index ;
-
LICENSE要想是Spec仓库接收,就必须包含一个license。命令
pod lib create
自动创建使用的是 MIT license;
2、如果用上面的命令创建工程模板,那么工程的目录下已经自动生成了.podspec(LCocopodsTest.podspec)。如果是已有的工程或者库文件目录,也可以利用Pod命令自己制作.podspec文件,命令如下:
pod spec cretae <组件库名>
PS注意:自动生成的podspec文件只是模板,需要结合工程的库文件、资源目录、远程代码仓库(第1步创建的远程代码仓库)修改补充podspec文件。
-
-
验证.podspec文件的格式是否正确
1、cd 到 *.podspec 文件所在的目录下,用到的一些命令
pod lib lint
解说:本地验证pod能否通过验证,如果失败使用下面命令:pod lib lint --verbose查看失败原因, 或使用pod lib lint --allow-warnings忽略警告错误pod spec lint
解说:本地和远程验证pod能否通过验证,需要更新提交podspec到远程specs仓库,一般本地验证通过即可提交到远程specs仓库pod lib lint --verbose
解说:加--verbose可以显示详细的检测过程,出错时会显示详细的错误信息pod lib lint --verbose --allow-warnings
解说: 允许警告,用来解决由于代码中存在警告导致不能通过校验的问题-
有时候会提示一个错误
⚠️:没有写简介,把简介填写一下,就可以验证通过。 - 有时候会提示一个错误:
⚠️:到这个提示错误信息的时候,使用如下指令:
pod lib lint 文件名称.podspec --use-libraries --allow-warnings
相应的执行上传指令的时候,也需要加上参数:
pod repo push GofSpecs GofKit.podspec --use-libraries --allow-warnings
pod lib lint --sources=[https://git.xxx.com/XesAppMediator...]
解说: 私有库依赖需要添加specs源来验证引用当前私有库的podFile中指定source为私有库地址
source http://[privateLibName]/cocoaspecs.git'
source 'https://github.com/CocoaPods/Specs.git'pod lib lint --help
解说:查看所有可选参数,可选参数可以加多个
-
-
提交工程代码
提交工程代码到远程代码仓库,可以利用git或者svn进行代码版本管理,提交代码到GitHub等, 初始化提交命令如下:
//初始化git版本管理仓库,模板代码已经初始化过此步骤可以忽略(有.git文件夹)
git init
//添加到暂存区
git add .
//提交到本地仓库
git commit -a -m '提交信息'
示例:git commit -a -m '添加pod组件库'
//打标签,注意此标签可能在podspec中用到,用于区分版本
git tag 1.0.0
//本地仓库与远程仓库关联(已关联过的,可以忽略)
git remote add origin <url>
//拉取和合并本地与远程仓库
git pull origin master --allow-unrelated-histories
//本地仓库代码推送到远程
git push --set-upstream origin master
此时如果你报错,查看报错信息中如果有:“pre-receive hook declined” 说明存在权限问题,没有master分支的代码提交权限。分配权限后,就可以push成功。
//推送标签
git push --tags
- 使用仓库
发布到Cocoapods后,在终端更新本地pods仓库信息
-
更新本地pods仓库信息
$ pod setup
-
查询仓库
$ pod search LCocopodsTest
-> LCocopodsTest (1.0.0)
A delightful TextField of PhoneNumber
pod 'BYPhoneNumTF', '~> 1.0.0'
- Homepage: https://github.com/xxx/LCocopodsTest
- Source: https://github.com/xxx/LCocopodsTest.git
- Versions: 1.0.0, 0.0.1 [LCocopodsTest repo]
(END)
若出现仓库信息说明已经成功了,这时候你就可以在 Podfile 添加、使用自己的仓库了 pod 'LCocopodsTest', '~> 1.0.0'
-
- 更新维护
当你的代码更新维护后,就需要重写发布,流程是:
-
更新LCocopodsTest.podspec中的版本号
-
打上标签推送远程
-
pod trunk push LCocopodsTest.podspec 推送到pods仓库
更新后你就可以在 CocoaPods Master Repo 仓库上看到自己的提交记录了。
-