使用cocoapods管理私有库

Posted iOS笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用cocoapods管理私有库相关的知识,希望对你有一定的参考价值。

背景


项目状况


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

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


略,具体见(


创建私有库流程


以下流程以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


2. 创建private repo


  • gitlab创建 FORNetwork

  • 权限是全组的 mobile


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.


剩下的警告都是依赖的第三方库和系统警告 大致看了一下 没有私有库本身导致的问题。


在做完这些判断后 我们就可以通过忽略警告来validate私有库了


1
$ pod lib lint --allow-warnings


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


命令如下


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


参考详见阅读原文

以上是关于使用cocoapods管理私有库的主要内容,如果未能解决你的问题,请参考以下文章

基于SVN服务器及cocoapods-repo-svn插件进行组件化私有库管理

项目管理:CocoaPods建立私有仓库

使用Cocoapods创建私有podspec

使用 SVN 建立和发布私有 CocoaPods 库

可以说是最快的CocoaPods私有库的搭建

iOS代码组件化--利用cocoaPods创建私有库