CocoaPods创建公有和私有Pod库方法总结

转载自:佳敏_朱 的文章
原文链接:https://segmentfault.com/a/1190000007947371

引言

刚毕业那段时间接触到的一些文章到处都在大谈iOS工程模块化(CocoaPods化), 本人也一直在着力于将公司项目代码解耦合, 但是因为一个人开发实在没有必要将工程CocoaPods化, 所以迟迟没有去研究将工程CocoaPods化的方法, 期间本人也抽时间去参加过蘑菇街等平台举办的架构交流会, 如今公司业务发展稳定, 终于有时间将创建公有pod库将自己的代码供其他开发者pod依赖使用的方法, 以及创建本地/内网的私有Pod库供公司项目组件CocoaPods化的方法研究清楚, 把这几天整理的笔记做个记录.

创建公有Pod库或者私有Pod库, 实际上原理是一样的, 都是基于git服务和repo协议, 不一样的是, 两者的版本索引查询方式不一样, 公有库的podspec由CocoaPods/Specs管理, 而内部私有使用的pod库需要自己建立一个仓库来管理podspec.

正文目录
一. 创建公有Pod库
1、注册CocoaPods账户信息
2、创建共享库文件并上传到公有仓库
3、编辑.podspec文件
4、打tag, 发布一个release版本
5、发布自己的库描述文件podspec给cocoapods
6、关于查找和使用新创建的库
7、更新维护podspec
二. 创建私有Pod库
1、创建一个git仓库用来做内部私有库的Spec Repo
2、创建私有Pod组件库
3、然后将podspec加入私有Sepc repo中
4、查找和使用内部组件库

一. 创建公有Pod库

例子: 我的第一个公共pod库JM_ActionSheet, Podfile中添加pod 'JM_ActionSheet'即可使用.

1、注册CocoaPods账户信息

想要创建一个开源pod库, 首先我们需要注册CocoaPods, 这里使用trunk方式, 作为一个iOS开发人员你一定安装了CocoaPods, 那么只需要在终端执行:

pod trunk register 邮箱地址 '用户名' --verbose

这里我们一般使用github邮箱和用户名, 然后在你的邮箱中会收到确认邮件, 在浏览器中点击链接确认即注册成功, 成功之后可以终端执行:

pod trunk me

查看自己的注册信息, 以后当你有了自己的开源Pod库, 也可以用此方式随时查看自己发布过的Pods;

[图片上传失败...(image-57c4e4-1512716649002)]

2、创建共享库文件并上传到公有仓库

共享库需要三个必不可少的部分:
A.

共享文件夹(文件夹存放着你要共享的内容, 也就是其他人pod得到的文件, .podspec文件中的source_files需要指定此文件路径及文件类型);
B.

LICENSE文件(默认一般选择MIT);
C.

库描述文件.podspec(本库的各项信息描述, 需要提交给CocoaPods, pod通过这个文件查找到你共享的库, .podspec文件的格式见第3点).

这一步分两种情况:
A.如果你已经有了现成的想要共享的文件,你只需要满足上面三个部分,即可上传到公有仓库即可继续其他的步骤;
B.你想要创建一个全新的工程去做自己的共享, 可以使用终端命令:

pod lib create 库名

去根据需要选择各项配置后创建一个标准的工程, 这里不做赘述, 具体请参考:Using Pod Lib Create;

你可以使用SourceTree等工具上传你的代码到公共仓库, 关于如何使用命令行上传代码到远端仓库, 可以移步:iOS开发使用Git那些事, 这里不做赘述.

3、编辑.podspec文件

JM_ActionSheet.podspec为例:

Pod::Spec.new do |s|
    s.name         = 'JM_ActionSheet'
    s.version      = '1.0.1'
    s.summary      = 'An ActionSheet like WeChat'
    s.homepage     = 'https://github.com/ZJM6658/ActionSheetLikeWeChat'
    s.license      = 'MIT'
    s.authors      = {'JM Zhu' => '815187811@qq.com'}
    s.platform     = :ios, '6.0'
    s.source       = {:git => 'https://github.com/ZJM6658/ActionSheetLikeWeChat.git', :tag => s.version}
    s.source_files = 'JM_ActionSheet/*.{h,m}'
    s.requires_arc = true
end

这是一个最简单的.podspec文件样式, 各项属性的意思一目了然, 如果本库中有依赖其他库, 加上``s.dependency '库名'`即可.

编写完成后, 我们需要验证.podspec文件的合法性, 这里需要终端cd到.podspec文件所在文件夹, 执行:

pod lib lint JM_ActionSheet.podspec

如有警告或者错误请重新检查你的编写正确性, 如果没有问题会出现

-> JM_ActionSheet (1.0.1)

JM_ActionSheet passed validation.

4、打tag, 发布一个release版本

一切准备就绪后, 我们需要在你的git仓库里面存在一个与.podspec文件中一致的version, 这里你可以在你的git仓库中的releases一项去手动发布, 也可以在当前文件夹下使用终端命令:

git tag -m 'first release' '1.0.1'
git push --tag #推送tag到远端仓库

成功之后即可在你的releases里面看到这个tag的版本.

5、发布自己的库描述文件podspec给cocoapods

同样在这个文件夹下, 终端执行:

pod trunk push JM_ActionSheet.podspec

将你的库文件.podspec文件提交到公有的specs上面, 这一步做的操作是验证你的podspec文件是否合法+提交到specs中(等同于fork;commit;push)+将上传的podspec文件转成json格式文件),成功后会出现Congrats信息噢~

[图片上传失败...(image-1db10c-1512716649002)]

6、关于查找和使用新创建的库

成功后需要等待的时间不定, 目前一般比较快, 一般使用pod setup和pod search查看是否已经可以使用, 本人创建这个库之后一个星期内每天尝试pod setuppod search JM_ActionSheet始终无法查找到自己的库, 查找资料之后找到解决办法:

1.pod setup成功后生成的~/Library/Caches/CocoaPods/search_index.json文件, 是用来查找的索引文件, 终端输入:

rm ~/Library/Caches/CocoaPods/search_index.json

删除~/Library/Caches/CocoaPods目录下的search_index.json文件, 删除成功后再执行:pod search 库名, 等待输出:Creating search index for spec repo 'master'.. Done! 稍等片刻就会出现你想要的结果~

7、更新维护podspec

如果有错误或者需要迭代版本,修改工程文件后推送到远端仓库后, 需要修改podspec中的版本号, 并重新打tag上传, 再进行新一轮的验证和发布, 当然, 创建一个演示demo工程供其他开发者下载查看并不会影响我们的pod库.

二. 创建私有Pod库

私有Pod库和公有Pod库的创建方式没有什么区别, 不一样的是管理他们的spec repo不一样
所以我们需要自己创建一个跟CocoaPods/Specs类似的仓库来管理内部创建的Pod库的podspec文件, 供内部人员更新和依赖使用内部Pod组件库.
私有repo的构建形式有两种, 一种是私有git服务器上面创建,一种是本机创建.
本机创建请参考官方文档:Private Pods,

这里介绍的是在公司内部搭建的git服务器上面创建整个服务的方式.

1、创建一个git仓库用来做内部私有库的Spec Repo

在私有服务器一个仓库,一个用来存放所有共享库的podspec, 这里创建好之后的内部SSH协议地址是:git@git.yaomaitong.net:iOSPods/ymtSpecs.git, 花钱买git的私有仓库或者使用其他免费的第三方git服务(如Bitbucket等)创建的私有仓库给到的http/https地址也一样.终端输入命令:

pod repo add ymtSpecs git@git.yaomaitong.net:iOSPods/ymtSpecs.git

将ymtSpecs添加到本地repo, 添加成功后可以在/.cocoapods/repos/目录下可以看到官方的specs:master和刚刚加入的specs:ymtSpecs

如果有其他合作人员共同使用这个私有Spec Repo的话在他有对应Git仓库的权限的前提下执行相同的命令添加这个Spec Repo即可.

2、创建私有Pod组件库

继续创建一个私有仓库,用来建立需要共享的内部组件, 以Category为例:git@git.yaomaitong.net:iOSPods/Category.git, 可以创建示例工程, 像创建公有的库一样, 填写自己的podspec文件

Pod::Spec.new do |s|
    s.name         = 'Category'
    s.version      = '1.0.1'
    s.summary      = 'ymt Category files'
    s.homepage     = 'http://git.yaomaitong.net/iOSPods/Category'
    s.license      = 'MIT'
    s.authors      = {'Gua Pi' => 'guapi@yaomaitong.cn'}
    s.platform     = :ios, '7.0'
    s.source       = {:git => 'http://git.yaomaitong.net/iOSPods/Category.git', :tag => s.version}
    s.source_files = 'AllCategory/*.{h,m}'
    s.requires_arc = true
end

值得注意的是:podspec文件中的homepage和source不支持ssh协议地址,所以我们得放入http/https地址.

与公有库的创建方式一样,

pod lib lint Category.podspec验证成功之后push到仓库, 然后打tag发布release版本.

3、然后将podspec加入私有Sepc repo中

公有库使用trunk方式将.podspec文件发布到CocoaPods/Specs, 内部的pod组件库则是添加到我们第一步创建的私有Spec repo中去, 在终端执行:

pod repo push ymtSpecs Category.podspec

添加成功之后ymtSpecs中会包含Category库的podspec信息, 可以前往~/.cocoapods/repos下的ymtSpecs文件夹中查看, 同时git服务器中的远端也更新了.

4、查找和使用内部组件库

执行pod search Category就能查到刚刚创建好的Category库了, 然后在想要使用此组件的工程的Podfile中加入pod 'Category', '~>1.0.1'即可使用内部组件啦!

值得注意的是:必须在Podfile前面需要添加你的私有Spec repo的git地址source, pod install时, 才能在私有repo中查找到私有库, 像这样:

    source 'git@git.yaomaitong.net:iOSPods/ymtSpecs.git'

    platform :ios, '7.0'
    target "test" do
        pod 'Category', '~>1.0.1'
    end

经过测试, 这种方式可以把你的所有可以拆分出来的组件, 甚至是业务都来使用Pod管理, 这样达到了解耦和单项更新优化某些组件不影响老版本的依赖使用, 出现问题修改Podfile中的依赖版本即可随时回滚, 给开发了带来极大的便利, 值得学习.

参考链接:
CocoaPods Guides
Private Pods
手把手教你发布代码到CocoaPods(Trunk方式)
使用Cocoapods创建私有podspec
COCOAPODS创建私有PODS

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容