惯例吹水
众所周知CocoaPods,已经成为iOS/Mac OS程序员离不开的三方库管理工具。
除了我们引用一些知名的大佬框架以外,有时候我们也想分享一下自己的小轮子,或者托管自己的私有框架,尤其是组件化需要,想要上传属于自己的CocoaPods怎么办呢?
查阅了官方文档和一些前辈们的blog,感觉并不难,为了便于理解每一步命令的作用,决定还是需要自己手撸一遍。
什么是CocoaPods
Define once, update easily。看到宣传标语就感觉很easy。CocoaPods是OS X和iOS下的一个第三类库管理工具,通过PodFile文件我们可以为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods本身所支持的),并且可以轻松管理其版本。
怎么安装CocoaPods
官方app下载地址
https://CocoaPods.org/app
民间小白鼠教程
https://www.jianshu.com/p/e85e71ed64e6
涉及到的一些概念
Podfile: 该文件为配置引用三方库文件,指定引用的库以及版本。
Podfile.lock: cocoapods根据本地podfile和远端仓库生成版本管理文件,便于用户协作。
.xcodeproj: iOS项目工程目录,本质是个文件夹,可用Xcode打开。
.xcworkspace:工作空间,联合多个项目工程,pod install后自动生成。
.podspec : 该文件为你的代码仓库索引描述文件,CocoaPods通过该文件对你真正存储代码工程的 Git 仓库进行索引与下载
本博客演示所用文件
SoulToolsLibrary: 托管我们的实现代码(根据公有私有选择是否公开),需要remote对应远程Git仓库
SoulPrivatePodspec: 托管我们生成的Podspec文件(私有Pod才用),私有库隐藏了源码则需要公开本仓库
SoulTestDemo: 模拟三方用户新建工程测试我们的Pod,不需要远程仓库,如果你非要建,就当我没说
以上文件目录,均放在~/MyPodLibrary目录里了,方便演示
上传一个公有Pod
官方文档如下
https://guides.CocoaPods.org/making/index.html
-
搜索有没有同名库
(因为最后一步CocoaPods会校验同名的库只有原作者才能上传)
- 创建远程仓库
我这里采用的gitee.com。其实和github.com是一样的,不过github只能建一个私有仓库不够用,所以就用码云了。
a.首先必须创建SoulToolsLibrary,这个仓库用来保存我们的轮子源码。
开源的话记得选开源许可证,我就直接MIT了;不开源的话,需要创建SoulPrivatePodspec仓库。这里不需要添加.Readme初始化,因为后边pods会自动帮我们添加Readme模板。
创建完成后无需Clone到本地目录,等下把CocoaPods自动生成的同名目录Remote过来就好了。后面我直接用SourceTree了,方便演示,当然也可以用命令行。
(本模块演示公有Pod,可以直接跳转到步骤c,私有的需要b的,下个模块单独解释。)
b.其次私有库的话需要创建SoulPrivatePodspec,这个仓库用来储存各个版本的.podspec索引文件。
直接开源就好,不然别人pod install的时候,还要获取你这个git权限。
创建完成后Clone到本地目录,我这里直接用SourceTree了,方便演示,当然也可以用命令行。
c.最后我们本地再建一个目录SoulTestDemo,用来模拟第三方用户工程测试我们pod能不能用,这个就留在本地就好了,不用同步到远端了。
最后目录如下图
-
本地新建工程
我们现在需要通过github的模板生成自己的Pod库开发环境
/*进入本地目录*/
cd ~/Users/mac/MyPodLibrary/SoulToolsLibrary
/*创建我们的pod库开发环境*/
pod lib create SoulToolsLibrary
/*配置开发环境*/
直接回车就是带下划线的默认值,具体配置如下附图
/*说明*/
配置完成后 会自动创建并打开Workspace
附图:
//platform 发布平台
iOS
//language 开发使用的语言
ObjC
//demo 是否包含演示程序;有两个用途:1.编写框架的时候可以用来测试,2.支持pod try MyLib(SoulToolsLibrary)
Yes
//testing frameworks 使用什么测试框架;
None
//view base testing 是否使用基于视图的测试;亲测选择yes的话,将自动导入FBSnapShotTestCase,这个框架只支持swift3.0,要求Xcode8一下...
NO
//class prefix 类名前缀;建议两位大写英文字母
ST
- 编写Library以及Demo
a.在上述自动打开的workspace,我们可以看到就说熟悉的pod install之后生成xworkspace是一样的,唯一不同的就是Pod引用我们自己的库的路径是本地相对路径。红框内的内容及Podspec的描述,两个红框指向的是同一文件;LICENSE即开源许可,一般不用管;README也是Cocoapods自动生成的描述,按照原有格式修改即可。
b.在上图中ReplaceMe.m文件处右键,Show in Finder。我们会发现两个平级目录,一个Classes保存我们类,还有一个Assets保存的是资源文件,例如图片等。这个示例文件ReplaceMe.m可以删除。
c.我们添加一个自定义类和方法,实现我们的库。
d.在Demo实现调用,我们打印一下。尖括号引用,完美运行~
- 配置xxx.podspec文件
s.name : 项目名
s.version : 版本号(需跟后面打 Tag 的值相等)
s.homepage : 项目主页(请注意,这里的地址跟git仓库地址有一定差别,请同学们看清截图示例并区分)
s.license : 开源协议(这里我们选择 MIT )
s.source : Git 仓库地址(第二步所复制的仓库地址)
s.ios.deployment_target : 项目最低支持版本
s.source_files : 具体去那个目录下下载特定共享代码(注意:这里的地址与 .podspec 文件同级目录开始,,示例:PrivateLib/Classes/** /*表示如下目录下的所有文件
- 验证.podspec 文件的格式正确性
pod lib lint --verbose
出现下图,即代表成功;
这里有个小技巧,就是lint前可以先回到xcodeproj目录pod install一下,自己排查有没有编译问题;
如果还有其他报错例如描述不合法等情况,修改后重新lint即可。
-
上传到Git,并标记Tag
- 注册CocoaPods作者信息
a.现在你已经拥有一个成功的SoulToolsLibrary了,现在想要share到平台上,那么是不是需要注册一个账号呢?ok通过以下命令,将会给你的邮箱发送一封邮件,点击链接即可注册成功。
pod trunk register [email protected] 'yourName' --description='Soul Personal Laptop' --verbose
账号创建完毕!~~
- 使用trunk上传pod
pod trunk push SoulToolsLibrary.podspec --verbose
感觉ok了,可以访问看一下这个json,一目了然就不分析了。
https://raw.githubusercontent.com/CocoaPods/Specs/b2c3735a9046e5373956b35a510414a93b0af5ff/Specs/4/b/a/SoulToolsLibrary/0.1.0/SoulToolsLibrary.podspec.json
-
搜索验证并使用
a.新建一个项目,并初始化Pod
b.编辑Podfile并install
c.Test调用打印
d.pod Search 一下 or pod try 一下;记得先pod setup更新一下本地库
上传一个私有Pod(对比公有)
1.托管代码的SoulToolsLibrary需要关闭开源。
2.将生成的podspec文件托管到SoulPrivatePodspec中,SoulPrivatePodspec仓库可以开源。
3.pod install的时候需要验证Git权限,即登录账号密码。
Cocoapods进阶
1.libwebp库Pod失败
业务场景:使用SDWebImage时需要支持webp,引入库SDWebImage/WebP后Pod install时执行失败。
解决思路:pod的原理就是从.podspec中获取配置,一般从github中同步代码;所以我们看一下托管的仓库地址,发现是google家的,一想那就是因为天朝的墙了
解决办法:
1、先通过 find ~/.cocoapods/repos/master -iname libwebp 直接就可以找到libwebp的地址
2、在Finder中找到对应版本的文件夹,找到libwebp.podspec.json文件
3、修改https://chromium.googlesource.com/webm/libwebp,替换为https://github.com/webmproject/libwebp.git