使用 cocoapods 管理私有库

1,297 阅读4分钟
原文链接: mp.weixin.qq.com

背景

项目状况

  • 项目前期实现为主 对业务代码和基础代码只做了大概隔离(目录上的隔离);

  • 业务代码和基础代码的隔离不彻底 有耦合 无法抽离基础代码供其他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)

略,具体见( blog.wtlucky.com/blog/2015/02/26/create-private-podspec/)

创建私有库流程

以下流程以FORNetwork举例

1. 添加私有库管理中心到cocoapods

# pod repo add [仓库名] [仓库链接]$ pod repo add FORSpecs git@gitlab.51offer.inner:mobile/FORSpecs.git

添加完之后 就能够在本地找到FORSpecs了 里面的内容就是我们未来需要用到的私有库 当然现在还是空的。

此时的目录结构为

.└── repos    ├── FORSpecs    └── master

2. 创建private repo

  • gitlab创建 FORNetwork

  • 权限是全组的 mobile

  • 拿到git地址 git@gitlab.51offer.inner:mobile/lib-FORNetwork.git

3. 创建你自己的private pod

cocoapods提供了一个命令 可以快捷创建一个private pod的环境

$ pod lib create FORNetwork

生成目录结构

.
├── 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 => '../'

source 'https://github.com/CocoaPods/Specs.git'use_frameworks!target 'FORNetwork_Example', :exclusive => true do// 指定路径  pod 'FORNetwork', :path => '../'endtarget '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私有库了

$ pod lib lint --allow-warnings

5.校验完毕,添加说明书到私有库管理中心中FORSpecs

命令如下

$ pod repo push FORSpecs FORNetwork.podspec

如果直接执行以下命令 仍旧会出现之前校验的报错 那是由于在上传前cocoapods仍旧会validate一次。

所以我们仍旧需要加上--allow-warnings参数

$ pod repo push FORSpecs FORNetwork.podspec --allow-warnings

这回就上传成功了

6. 本地搜索一下私有库

$ pod search FORNetwork

得到结果如下

-> FORNetwork (0.1.0)

   51offer网络库

   pod 'FORNetwork', '~> 0.1.0'

   - Homepage: http://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” 自动运行脚本。

参考详见原文