使用Gitlab和Cocoapods创建私有pod

每个稍微有点开发经验的 iOS 工程师都很容易的发现一下几点:

  1. 几乎每个 iOS 的项目都适用了 Cocoapods
  2. 几乎每个 ObjC 的 iOS 项目是使用 AFNetworkingSDWebImage等三方框架。
  3. 几乎每个 Swift 的 iOS 项目都是用了 AlamofireKingfisher等三方框架
  4. 每一次这些框架更新之后, 无数个工程师只需要在终端执行一下’pod update’ 或 pod install就能对应的更新自己项目中的代码

这几乎都是每个 iOS 工程师经常都会遇到的事情。目前几乎所有优秀的 iOS 开源框架都支持了 CocoaPods。 几乎所有的 iOS 项目都集成了 CocoaPods

但是我们在日常的开发中也常会遇到这样的问题:

  1. 很多公司都有好 App 同时在进行开发。
  2. 这些 App 或多或少在业务或者 UI 都很很多的重合。

着就意味着有很多的代码在这些 App 中都是可以复用的。由于各种各样的原因,同个公司的不同 App 可能更新不同步。 app A 可能已经升级到新版本 app B 可能还在老版本。每个 App 分别管理势必会出现混乱的局面。一起管理又存在新旧交替的问题。如果每个 App 又不同的工程师负责, 即使可能有交叉 review 的机制, 但也很难保证公司代码的统一。很多逻辑都存在多段代码。

如何管理公司的公共代码库就成了一个比较麻烦的问题。

集成 IJKMediaPlayer 的时候,想到了使用git来区别版本,然后使用 framework 来管理共有代码。然而在出现了你的代码需要使用到其他的 Framework 的时候, 或者好几个 Framework 都需要使用同一个第三方框架的时候, 这么做确实也是件恼火的事情。

去年写了三了小组件 SYNetwork EmptyDataKit SYPhotoBrowser。前两个已经支持了 Cocoapods 之后网上不断的开始有一些利用 cocoapods进行组件化的文章。前些天在 去直播看了 casa 的两个关于组建化的直播之后。也一直蠢蠢欲动想自己也来做一下这件事情。

做开源的 repo 的时候,还是比较顺利的做到了这件事情。但是当时想用 OSChina 来做了几次都没有成功。就一直搁置了。

春节之后换了个工作, 适应了公司的环境, 简单的学习了一下 Swift 之后, 公司还是决定对现有的项目进行一次梳理,然后做一次重构。 所以很自然的还是想到了使用 CocoaPods 将公司原有的项目进行组件化。

结果了半天时间的尝试,报错create gitlab账号等等。终于达到了最初的想法。 所以将这个过程记录下来。

为什么使用 GitLab

其实上面已经说到了,为什么要使用 CocoaPods 来做这件事情。也说到了为什么要做这件事情。为什么使用 gitlab 呢? 原因很简单。 毕竟 GitHub 的私有repo 是收费的。原谅我穷, 也可以说是公司扣门儿。只能把开源的东西放在, GitHub 把不能开源的东西放在其他地方。

准备

其实没什么好准备的。 但是首先你得有个 Gitlab 账号吧! 如果没有注册之后添加 SSH 就好了。

然后在 Gitlab 上创建一个空的仓库:XXX 然后记住这个项目的 地址: git@gitlab.com:XXX/XXX.git

创建工程

这些可以看我去年年底写开源 Cocoapods 的时候写的东西。使用 Cocoapods 管理你的项目

基本上简化一下就是以下

创建工程

1
$ pod lib create XXX

回答问题

添加私有库到本地 pod 库(多人开发其他人也应该有这个操作)

1
$ pod repo add XXX git@gitlab.com:XXX/XXX.git

可以检查一下: ~./cocoapods/repos 目录下又了 XXX 文件夹

将代码放进去

这一步上篇文章中有。 使用 Cocoapods 管理你的项目

修改 .podspec

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Pod::Spec.new do |s|
s.name = 'XXX'
s.version = '0.0.1'
s.summary = '这是项目的基础框架,所有项目都需要集成.'
s.homepage = 'https://gitlab.com/XXX/XXX'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'XXX' => 'cd_sunyang@163.com' }
s.source = { :git => 'git@gitlab.com:XXX/XXX.git', :tag => s.version }
s.ios.deployment_target = '8.0'
s.source_files = 'XXX/Classes/**/*'
s.frameworks = 'UIKit'
s.dependency 'AFNetworking'
s.dependency 'MBProgressHUD'
end

我这个Demo引用了两个公有的repo

提交代码

1
$ git add .
1
$ git commit -m "commit comments"
1
$ git push origin master

检查一下

1
2
3
$ pod lib lint
#或者 pod lib lint --allow-warnings 忽略警告

然后也可以在项目中的 podfile文件中添加

1
2
3
pod 'XXX', :path => '/Users/xxx/Desktop/XXX'
## 最后路径以实际情况为准, 有可能不在桌面
1
pod install

成功后我们的库会出现在Development Pods文件夹里面。可以检查一下有没有问题。

提交私有库

1
$ git tag 0.0.1
1
$ git push --tags
1
pod repo push XXX XXX.podspec

遇到的问题

报错

在执行

1
$ pod lib lint

的时候,如果在你的文件中引入了一些三方库, 并且在.podspec文件中也添加了对用的.dependency 依然出现

1
- ERROR | xcodebuild: /Users/xinhuikeji/Library/Developer/Xcode/DerivedData/App-cpgccqdjhyrbqwcpjanyefntolkf/Build/Products/Release-iphonesimulator/wLib/wLib.framework/Headers/BaseModel.h:13:9: error: include of non-modular header inside framework module 'wLib.BaseModel' [-Werror,-Wnon-modular-include-in-framework-module]

这样的错误。

在命令后面添加参数 --use-libraries

1
2
$ pod lib lint xxx.podspec --use-libraries
$ pod repo push XXX XXX.podspec --use-libraries

segmentfault中看到的答案。

pod search 找不到

最后完成之后在新建的工程中

1
$ pod init
1
$ vim podfile

添加

1
pod "SYBase", :git => 'git@gitlab.com:CepheusSun/SYBase.git'
1
pod install

然后莫名其妙发现引入的 repo 是0.1.0或者什么巴拉巴拉版本的。这个时候更新一下pod

1
pod update


1
pod install

强迫症

如果遇到强迫症想要用 1.1.1 这样的三级版本的话。

XXX.podspec 文件中的

1
s.source = { :git => 'git@gitlab.com:XXX/XXX.git', :tag => s.version }

必须用 s.version

我也不知道为什么。

结束篇

好久没写文章了。终于还是继续写了下去。这段时间自己学了学Swift 学了学 函数响应式编程, 七牛云直播的认证也下来的。接下来可能要研究一下推流相关的东西。2017 的前半段老实说学到了很多的东西。一直很感恩也很珍惜这样的情况。

参考文档

组件化开发之CocoaPods私有库制作
使用cocoapods管理私有库

CepheusSun wechat
订阅我的公众号,每次更新我都不一定会告诉你!
坚持原创技术分享,您的支持将鼓励我继续创作!
0%