背景
项目状况
项目前期实现为主 对业务代码和基础代码只做了大概隔离(目录上的隔离);
业务代码和基础代码的隔离不彻底 有耦合 无法抽离基础代码供其他app使用(目前暂无此需求);
基础代码和基础代码之间相互调用 有耦合 无法单独使用其中一部分;
基础代码并无版本的概念 每次改动其实并没有兼容的概念 此时的基础代码其实是当业务代码在用。
私有库的目的
去除业务代码和基础代码的耦合 使代码更干净;
基础代码模块化 更容易管理 测试;
业务代码的调用会更统一;
使基础代码有version的概念 为未来两个app调用不同版本的基础库做准备。
Cocoapods的一些基本概念
使用cocoapods的原因
方案成熟 例子众多;
支持指定版本;
支持部署到私有的仓库;
项目原本第三方库代码的引入就基于cocoapods 团队接受成本低。
cocoapods如何管理第三方库代码
有一个集中的git repo 专门存放所有第三方库的说明和链接 暂且称之为索引库;
第一个pod install的时候 会clone一份索引库到本地 路径为/Users/toamtopeter/.cocoapods/repos/master;
每次pod install或者update 会从remote拉去最新的Specs;
Specs里面有第三方库的各个版本的历史;
根据Podfile再对比Specs 就能够拉去相应的代码了。
公有库和私有库的区分
公有库的git repo是公开的 私有库的git repo是private的;
公有库中的描述文件格式为json 私有库中为ruby。
创建私有库管理中心(Spec repo)
略,具体见(https://blog.wtlucky.com/blog/2015/02/26/create-private-podspec/)
创建私有库流程
以下流程以FORNetwork举例
1. 添加私有库管理中心到cocoapods
1 2 |
# pod repo add [仓库名] [仓库链接] $ pod repo add FORSpecs git@gitlab.51offer.inner:mobile/FORSpecs.git |
添加完之后 就能够在本地找到FORSpecs了 里面的内容就是我们未来需要用到的私有库 当然现在还是空的。
此时的目录结构为
1 2 3 4 |
. └── repos ├── FORSpecs └── master |
gitlab创建 FORNetwork
权限是全组的 mobile
拿到git地址 git@gitlab.51offer.inner:mobile/lib-FORNetwork.git
3. 创建你自己的private pod
cocoapods提供了一个命令 可以快捷创建一个private pod的环境
1 | $ pod lib create FORNetwork |
生成目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
. ├── Example │ ├── FORNetwork │ ├── FORNetwork.xcodeproj │ ├── FORNetwork.xcworkspace │ ├── Podfile │ ├── Podfile.lock │ ├── Pods │ ├── Tests │ └── build ├── FORNetwork.podspec ├── LICENSE ├── Pod │ ├── Assets │ └── Classes ├── README.md └── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj |
创建的文件及文件夹中 有两个尤为重要
Example
FORNetwork.podspec
Example
用于demo演示 项目结构和我们平时引入cocoapods的项目结构一致。
唯一区别的地方是Podfile。
由于此时我们的私有代码是在本地 所以对于本地私有代码的引入是通过path, pod 'FORNetwork', :path => '../'
1 2 3 4 5 6 7 8 9 10 11 12 13 |
source 'https://github.com/CocoaPods/Specs.git' use_frameworks! target 'FORNetwork_Example', :exclusive => true do // 指定路径 pod 'FORNetwork', :path => '../' end target 'FORNetwork_Tests', :exclusive => true do pod 'FORNetwork', :path => '../' pod 'Kiwi' pod 'FBSnapshotTestCase' end |
那么私有库的代码放在哪里?
默认我们需要放到下图的Class中。
是不是一定要放到Class下?当然不是 路径可以在 FORNetwork.podspec中指定。
需要注意的时候 当我们Class中添加/删除/修改文件结构的时候,我们都需要对pod udpate用于更新。
podspec
podspec就是整个私有库的说明书
4.完成开发后校验
在所有的私有库代码开发完成 并且 已经在 Example中添加演示代码后 我们就可以校验了。
校验的目的是什么?
校验是为了检测 此时的私有库是否符合标准,是否有警告,是否有错误等等。。。
可以看到有很多警告。。。
WARN | source: Git SSH URLs will NOT work for people behind firewalls configured to only allow HTTP, therefore HTTPS is preferred.
这是由于我们在podspec说明中指定的地址是git 而不是 http或者https 无关紧要 忽略。
剩下的警告都是依赖的第三方库和系统警告 大致看了一下 没有私有库本身导致的问题。
在做完这些判断后 我们就可以通过忽略警告来validate私有库了
1 | $ pod lib lint --allow-warnings |
命令如下
1 | $ pod repo push FORSpecs FORNetwork.podspec |
如果直接执行以下命令 仍旧会出现之前校验的报错 那是由于在上传前cocoapods仍旧会validate一次。
所以我们仍旧需要加上--allow-warnings参数
1 | $ pod repo push FORSpecs FORNetwork.podspec --allow-warnings |
这回就上传成功了
6. 本地搜索一下私有库
1 | $ pod search FORNetwork |
得到结果如下
-> FORNetwork (0.1.0)
51offer网络库
pod 'FORNetwork', '~> 0.1.0'
- Homepage: https://gitlab.51offer.inner/mobile/lib-FORNetwork
- Source: git@gitlab.51offer.inner:mobile/lib-FORNetwork.git
- Versions: 0.1.0 [FORSpecs repo]
和我们在说明书中填写的一致 此时说明私有库搭建完成。
6.项目中引用
虽然可以搜索到,但是项目中引入仍旧需要做一些处理。
我们需要在Podfile中指定source。
小结
整体来说,创建私有库不难,维护私有库很麻烦,一旦有新代码的改动,每次都需要创建新版本,有点繁琐。
后续希望通过两方面来简化流程:
脚本编写 一步搞定所有流程 方便更新版本;
git hook监控commit 当检测到特定文本比如”更新pod” 自动运行脚本。
参考详见阅读原文。
我来说两句排行榜