Cocoapods: 私有仓库

使用场景

在我之前的博客中分享了几篇关于 Cocoapods 的文章(文末有链接),今天分享另外一个主题即如何创建你自己的私有仓库以及如何使用私有仓库。

为什么会有这种需求呢?

开发组内或者公司内,不希望把一些核心的公用代码给到外界使用(不开源),但是这些代码基本很稳定很成熟,可以做成组件给到其他人或者组内使用。

那么,就可以使用 Cocoapods 来创建自己的私有仓库,让大家共享代码,也是组件化的一种方案。

下面的分享全是基于实践所得,中间也遇到很多坑,都被我一一解决了,希望能帮到正在阅读文章的你。

创建仓库

这里的创建仓库,包括两个仓库,一个是代码仓库,另一个是 pod 源的仓库。

Github 创建 repository,如图:
1

1

创建名为 iOS_private_lib 的 repository,这个主要用来存放我们的代码。

同样道理,创建一个 Repo 用于存放私有的 SpecRepo 源,我创建的是 https://github.com/veryitman/private_spec_repo.git 这个仓库。

为了说明问题,这里我使用了 Public 来模拟 Private 仓库。在实际开发中,一般都是使用公司自己搭建的私有 git 服务器来做,我这里主要是为了说明问题。

创建代码工程

1. 先 clone 刚才创建的 repo 到本地

1
2
3
cd ~/workspace/
git clone https://github.com/veryitman/iOS_private_lib

2. 创建工程

~/workspace/iOS_private_lib 下使用 pod lib create 创建工程,工程名字为 CoreHTTP,执行命令如下:

1
2
3
cd ~/workspace/iOS_private_lib
pod lib create CoreHTTP

根据提示输入对应的信息即可完成创建,如图:
1

创建成功后,包含一个 Example 例子工程,工程目录如下:
1

使用 Xcode 打开例子工程,在 CoreHTTP/Classes 中创建文件即可,如下图所示:
1

3. 编辑 podspec 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Pod::Spec.new do |s|
s.name = 'CoreHTTP'
s.version = '0.1.0'
s.summary = 'CoreHTTP for create private pod, it is a demo only.'
s.description = <<-DESC
The project of CoreHTTP is a private pod, it is a demo only.
DESC
s.homepage = 'https://github.com/veryitman/iOS_private_lib.git'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'veryitman@126.com' => 'veryitman@126.com' }
s.platform = :ios, "7.0"
s.source = { :git => 'https://github.com/veryitman/iOS_private_lib.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = 'CoreHTTP/Classes/**/*'
s.requires_arc = true
end

这里需要注意,如果 s.source_files 写的不对,会报下面的错误。

1
- ERROR | [iOS] file patterns: The `source_files` pattern did not match any file.

CoreHTTP 的名字必须是你代码存放的文件夹名,而且这个文件件要与 podspec 文件在同一级文件目录下,从上面截图的目录结构可以看出。

另外一个提示的错误点,可能是因为空目录的问题造成的,如果这样的话,可以在各个文件夹下面创建 .gitkeep 文件,该文件的作用是为了提交空文件夹,因为 git 默认是不会添加空文件夹到仓库的。

创建 .gitkeep 文件的命令如下:

1
2
3
cd 文件夹下
touch .gitkeep

这里我折腾了蛮久,最后思考和参考了自己之前的开源项目管理博客,才解决这个问题。

4. 检查和验证本地 podspec 文件

1
2
3
cd CoreHTTP
pod lib lint CoreHTTP.podspec

验证通过会显示如下图所示的成功提示
1

使用 Xcode 打开工程,删除对应以 Test开头 的相关的库和文件夹,确保 Xcode 能编译通过,选择模拟器即可。

这里一定要先清空 cocoapods 的缓存,否则后面远程验证还是报错,无法通过验证。

清空 cocoapods 的缓存,命令如下:

1
2
3
rm ~/Library/Caches/CocoaPods/Pods/External/CoreHTTP
rm ~/Library/Caches/CocoaPods/Pods/Specs/External/CoreHTTP

5. 上传工程到 Github 远程代码仓库

1
2
3
4
5
6
7
cd ~/workspace/iOS_private_lib
git add CoreHTTP/
git commit -m "Add lib."
git push

6. 给版本添加 tag

1
2
3
4
5
cd ~/workspace/iOS_private_lib
git tag 0.1.0 -m "Add lib and example project."
git push --tags

7. 进行远程验证

1
2
3
cd ~/workspace/iOS_private_lib
pod spec lint CoreHTTP/CoreHTTP.podspec --verbose --use-libraries --allow-warnings

注意:--verbose 选项是为了看编译和验证信息,--use-libraries 是为了能支持 i386 架构,如果不加此参数,私有库无法通过验证,--allow-warnings 参数是允许有警告。

验证成功的示意图:
1

提交私有 podspec

1. 向本地的 cocoapods 仓库添加私有 Spec Repo

1
2
3
cd ~/workspace/iOS_private_lib
pod repo add PrivateSpec https://github.com/veryitman/private_spec_repo.git

这里一定要注意:对应的地址是 SpecRepo 仓库地址而不是代码仓库地址。

本地存放 spec 的私有仓库名称,我这里取名为 PrivateSpec,你也可以取其他名字,但是记住在下面的步骤中要保持一致。

1
ls -alt ~/.cocoapods/repos/

可以看到已经成功添加本地 repo 中,其他 master 是 cocoapods 官方公开的源,其他为私有源。如下图所示:
1

2. 向私有的 Spec Repo 中提交 podspec

下面的 PrivateSpec 是与上面的名称对应的。

1
2
3
cd ~/workspace/iOS_private_lib
pod repo push PrivateSpec ./CoreHTTP/CoreHTTP.podspec --verbose --use-libraries --allow-warnings

这里要注意,添加私有库和之前博文 Cocoapods 管理开源项目 中提到的 pod trunk push 是不一样的操作。

使用私有库

1. 搜索库

1
pod search CoreHTTP

如果搜索不到,可以执行下面的两条命令:

1
2
3
rm ~/Library/Caches/CocoaPods/search_index.json
pod setup

然后继续搜索就可以了,搜索成功会显示如下内容:

1
2
3
4
5
6
CoreHTTP (0.1.0)
CoreHTTP for create private pod, it is a demo only.
pod 'CoreHTTP', '~> 0.1.0'
- Homepage: https://github.com/veryitman/iOS_private_lib.git
- Source: https://github.com/veryitman/iOS_private_lib.git
- Versions: 0.1.0 [PrivateSpec repo]

为了避免和其他私有库命名冲突,建议在自己的私有库前面加上公司或者其他标示,如 TepdCoreHTTP、FphCoreHTTP 等。

2. 在 Podfile 文件的顶部添加 source

1
2
source 'https://github.com/veryitman/private_spec_repo.git'
source 'https://github.com/CocoaPods/Specs.git'

注意一个是我们私有 SpecRepo 地址(非私有代码库地址),另一个是官方公有源地址。

使用私有库的工程的 Podfile 写法示例如下:

1
2
3
4
5
6
7
8
source 'https://github.com/veryitman/private_spec_repo.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '7.0'
target 'TestCoreHTTP' do
pod 'CoreHTTP', '~> 0.1.0'
end

在工程中可以直接使用私有库了,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import "ViewController.h"
#import <CoreHTTPHeader.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *lib_desc = [CoreHTTPHeader libDesc];
NSLog(@"The HTTP's library desc: %@", lib_desc);
}
@end

pod 命令

1
2
3
4
5
6
7
8
//将工程添加到本地 repo 中
pod repo add [本地私有仓库名] [远程仓库地址]
//移除本地 repo
pod repo remove [本地私有仓库名]
//查看本地 repo
pod repo
1
2
3
4
5
//只从本地验证你的pod能否通过验证
pod lib lint *.podspec
//从本地和远程验证你的pod能否通过验证
pod spec lint *.podspec

参考文档

Private Pods

我的其他文章

Mac install Cocoapods

Cocoapods 问题集锦

Cocoapods 管理开源项目

iOS 项目: 打造本地 pod 库


扫码关注,你我就各多一个朋友~

坚持原创技术分享!