CocoaPods 私有库搭建

参照官方文档 CocoaPods 官方文档

一、创建两个 git 仓库

我们创建两个 git 仓库,一个用来做私有 Spec Repo,一个是我们自己的公共组件:

第一个仓库名称是 Spec,专门用来做私有Spec Repo。

第二个仓库名称是 BGNetwork,这个就是我们公共组件库。

在这里,我们来说一下什么是Spec Repo?

他是所有的 Pods 的一个索引,就是一个容器,所有公开的 Pods 都在这个里面,他实际是一个 Git 仓库 remote 端。
在 GitHub 上,当你使用了 Cocoapods 后他会被 clone 到本地的 ~/.cocoapods/repos 目录下,
可以进入到这个目录看到 master 文件夹就是这个官方的 Spec Repo 了。

二、添加私有Spec repo(索引库) 到 Cocoapods

主要命令是pod repo add REPO_NAME SOURCE_URL。其中,REPO_NAME 是私有 repo 的名字,取一个容易记住的名字,后面还会用到,以后公司内部的组件对应的 podspec 都可以推送到这个 repo 中;SOURCE_URL 就是刚刚我们创建的 Spec 仓库链接。

$ pod repo add eric https://github.com/eric/Spec.git
$ ls ~/.cocoapods/repos  
  eric    master

这时,你会发现有两个文件夹 eric 和 master,master 是 Cocoapods 官方的 repo,而 eric 就是我刚刚创建的。
进入 eric 文件夹查看,你会发现它是 clone 了一份 https://github.com/eric/Spec.git。

在这里,我们是一个空的仓库,可以不检查,但是你的仓库如果有什么其他东西的话,可以检查一下。

$ cd ~/.cocoapods/repos/eric
$ pod repo lint .

三、制作自己的公共组件

1、将我们前面创建的 BGNetwork 项目克隆到本地

$ git clone https://github.com/eric/BGNetwork.git

2、在本地我们使用了 xcode 创建了项目,并且写了一个网络框架,运行没有问题,我们准备提交到 github,并打上版本号。

$ git add .
$ git commit -m 'add file'
$ git push origin master
$ git tag -m 'add tag' '0.1.1'
$ git push --tags

3、我们开始制作 Podspec 文件。

BGNetwork 是一个基于 AFNetworking 而封装的网络框架,它主要的源文件都在 BGNetwork/BGNetwork 路径下。我们将它放在 CocoaPods 给第三方使用,主要是将这个文件夹下的源文件加载到第三方的项目中以供使用。
下面是供第三方使用的源文件结构,具体可以下载 BGNetwork 代码查看

____BGNetwork
| |____BGAFHTTPClient.h
| |____BGAFHTTPClient.m
| |____BGAFRequestSerializer.h
| |____BGAFRequestSerializer.m
| |____BGAFResponseSerializer.h
| |____BGAFResponseSerializer.m
| |____BGNetworkCache.h
| |____BGNetworkCache.m
| |____BGNetworkConfiguration.h
| |____BGNetworkConfiguration.m
| |____BGNetworkConnector.h
| |____BGNetworkConnector.m
| |____BGNetworkManager.h
| |____BGNetworkManager.m
| |____BGNetworkRequest.h
| |____BGNetworkRequest.m
| |____BGNetworkUtil.h
| |____BGNetworkUtil.m

在 BGNetwork 项目的根目录下创建一个 BGNetwork.podspec 文件,对应上面的需求,我们的 podspec 可以这么写

Pod::Spec.new do |spec|
  #项目名称
  spec.name         = 'BGNetwork'
  #版本号
  spec.version      = '0.1.1'
  #开源协议
  spec.license      = 'MIT'
  #对开源项目的描述
  spec.summary      = 'BGNetwork is a request util based on AFNetworking'
  #开源项目的首页
  spec.homepage     = 'https://github.com/eric/BGNetwork'
  #作者信息
  spec.author       = {'eric' => 'eric@126.com'}
  #项目的源和版本号
  spec.source       = { :git => 'https://github.com/eric/BGNetwork.git', :tag => '0.1.1' }
  #源文件,这个就是供第三方使用的源文件
  spec.source_files = "BGNetwork/*"
  #适用于ios7及以上版本
  spec.platform     = :ios, '7.0'
  #使用的是ARC
  spec.requires_arc = true
  #依赖AFNetworking2.0
  spec.dependency 'AFNetworking', '~> 2.0'
end

注意:spec.source 源是 BGNetwork 的 git 仓库,版本号是我们上一步打上的版本号 0.1.1。

4、验证并推送到服务器

在推送前,我们先验证Podspec(检查本地pod),验证的时候是验证BGNetwork.podspec文件,所以我们需要保证进入的目录和 BGNetwork.podspec 同级的,
验证命令如下:

$ pod lib lint BGNetwork.podspec --no-clean --allow-warnings --verbose
或
$ pod lib lint 

# 注意可以在最后面 带上 --sources = ‘’
$ pod lib lint BGNetwork.podspec --no-clean --allow-warnings --verbose --sources = 'xxxx,https://github.com/CocoaPods/Specs.git'

# The sources from which to pull dependent pods(defaults to https://github.com/CocoaPods/Specs.git). Multiple sources must be comma-delimited.
# 意思是 这个podspec里面依赖了另一个私有库,为了能找到依赖私有库的地址,需要带上私有库的spec(索引库地址),其中 'xxxx'就是其地址

注意:验证的时候,会获取 BGNetwork.podspec 文件中的 spec.source 来获取 git 服务器上面对应版本的代码,
然后再找到 spec.source_files 中的源代码,通过 xcode 命令行工具建立工程并且进行编译。所以这一步的过程会比较久,如果编译没有错误,就验证通过。
建议加上 –fail-fast ,不然每次都是全部编译完成后才报错,当 podspec 很大的时候,会特别费时,加上此参数可以让其停止在错误的地方

如果没有错误和警告我们就可以推送到服务器了,推送使用的命令如下:

$ pod repo push REPO_NAME SPEC_NAME.podspec --allow-warnings --verbose

# 注意可以在最后面 带上 --sources = ‘’
$ pod repo push REPO_NAME SPEC_NAME.podspec --allow-warnings --verbose --sources = 'xxxx,https://github.com/CocoaPods/Specs.git'

# The sources from which to pull dependent pods(defaults to https://github.com/CocoaPods/Specs.git). Multiple sources must be comma-delimited.
# 意思是 这个podspec里面依赖了另一个私有库,为了能找到依赖私有库的地址,需要带上私有库的spec(索引库地址),其中 'xxxx'就是其地址

它也会先验证,然后再推送。我这里推送 BGNetwork 命令是:

$ pod repo push eric BGNetwork.podspec

如果没有错误,但是有警告,我们就将警告解决,也可以加 –allow-warnings 来提交

$ pod repo push eric BGNetwork.podspec --allow-warnings

如果有错误,我们可以去查看错误信息对应下的Note信息并解决。在这错误当中,常常会遇到找不到对应文件的错误,这个时候你需要查看
BGNetwork.podspec 文件中 spec.source 下 git 仓库链接是否没问题,git 仓库下对应的 tag 版本中 spec.source_files 路径下是否正确。

如果查看 Note 信息看不出什么问题,可以加上 verbose 参数进行更详细的查看。

$ pod repo push eric BGNetwork.podspec --allow-warnings --verbose

注意事项:碰到本地使用 pod lib lint 验证通过,但是 push 到服务器却失败了,这个时候很可能就是服务器 tag 版本不对,使用 –verbose 能查看详细的错误信息。

5、搜索我们的框架

到这一步,我们就可以通过 pod search BGNetwork 来搜索了,搜索到了说明我们私有源建立成功。

$ pod search BGNetwork
-> BGNetwork (0.1.2)
   BGNetwork is a request util based on AFNetworking
   pod 'BGNetwork', '~> 0.1.2'
   Homepage: https://github.com/eric/BGNetwork
   Source:   https://github.com/eric/BGNetwork.git
   Versions: 0.1.1, 0.1.0 [eric repo] - 0.1.2, 0.1.1 [master repo]

由上面的搜索知道,BGNetwork 在 eric 这个私有 repo 中存在 0.1.1 和 0.1.0 版本,在 master 中存在 0.1.2 和 0.1.1 版本。
搜索成功之后,我们将 BGNetwork.podspec 也推送到远程服务器。

四、注意

1、途中遇到了几次问题,就是pod repo push不上去,显示没有找到对应文件,后来发现是版本的问题,没有打上版本号或者Podspec中版本错了。

2、若是在框架当中,存在不同的文件夹,请使用 subspec。如果不同文件夹之间的文件有相互导入的情况,请将被导入的头文件设置为 public_header_files,

并且通过 dependency 设置依赖,具体可以参考 AFNetworking 的 podspec 文件。

3、若是需要提交给官方,请使用

$ pod trunk register youremail
# 查看信息
$ pod trunk me
# 将对应的pod推送到服务器
$ pod trunk push

4、使用 pod install 时,它首先会更新整个官方的源,而 Cocoapods 每天都有很多人提交,所以更新比较慢。所以,建议每过一段时间更新一下官方库,平常的时候,咱们可以在 install 或 update 加一个参数 –no-repo-update 让它不用更新。

$ pod install --verbose --no-repo-update
$ pod update --verbose --no-repo-update

5、多个模块

但如果我们需要拆分出几个子模块让开发者去选择, 这里有两种方案:

开启多一个Git仓库, 分开来存储
通过编写podspec文件的技巧拆分,(参照 AFNetworking)