创建私有pod库并发布到Cocoapods

老哥们,小弟又来了!哈哈
最近工作闲了下来,在等设备安装之后调试,因为觉得好玩闲来无事搞了搞pod,发布了个CJSegmentController

探究

不知道各位对pod的理解是怎样,以前虽然常用Cocoapods,但是其实不太清楚原理。最近探究据我的理解是:pod中的各种三方库是存放在cocoapods管理的一个git项目中,当我们在新设备上安装pod的时候记得要setup一下么?执行pod setup操作后我们会在cocoapods的目录下将pod的远程master分支拉取到本地。默认路径为~/.cocoapods/repos/master。如下图

拿AFN来举例,进入文件夹发现有不同版本的文件夹。每个版本的文件夹对应的是该版本的podspec.json配置文件,来看一下该配置文件里都存储了什么信息:

这基本也就是podspec(即该库该版本的配置信息),上面几条估计大家都能看明白,然后看到'source'这条,what means?? git即为AFN公布的git地址。可以看到在github上。那下面的tag是什么?这里就是至关重要的一点,tag,我想git熟练的老哥们应该知道tag是个啥。tag就是标签嘛。一般在某一产品发布之后在git中打上tag可以便于我们寻找哪个版本app的位置。

打Tag

切换到当前需要打tag的git节点下,tag命令如下:

git tag -a v1.0.3 -m ‘release version’ //创建一个名为1.0.3的tag(-m为可选)

git push –tags //将tag推到remote

然后pod根据配置文件中的这个tag值去你的git source中查找对应版本的三方库。

原理就讲到这里,还有几个重要的标签,我们接下来再讲。

创建私有仓库

重点现在开始了

master是pod的,我们可以fork一份官方的master。但是定制性比较差嘛因为它压根就是为pod服务的。

那么私有仓库的优点就来了:如果你有在项目中很常用的自己写的库或者文件,可以塞进来,其实也就稍微省了那么一丢丢时间,然后项目整洁一些。当然这么做也是有缺点的。万一….你写错代码了呢?会超级麻烦的。

我就直接用了github作为私有仓库,当然如果大家有不想public的库也可以用自己公司的gitlab或者三方的coding,bitBucket等可免费私有的git仓库。

创建空私有库

先去git上创建一个仓库,就命名为CJSpecs好了。最好不要选择生成readme/gitignore/license文件。等会初始化podspec的时候会产生不必要的merge。就生成一个空仓库好了。

空仓库好了。我们来让pod为我们初始化本地内容:

terminal中执行如下命令

1
pod repo add [Private Repo Name] [Github HTTPS clone URL]

Private Repo Name为本地私有仓库名称,而后者就是git上的地址啦。这里我的命令是下面这样的:

//pod repo add CJ https://github.com/jzy476731162/CJSpecs

随后pod在根目录中为我们生成了CJ这个目录,这个目录的git地址是你刚才配置的私有仓库地址(remote repo)。如果记不清后面会迷糊的。之前配置的时候我就没记清这个,饶了好大一个圈子…

生成后是下图这个样子(但是请忽略掉上面两个文件夹。此步骤应该只生成了license和readme)

这里步骤不能出问题,有好多博客写的顺序都是乱的。瞎搞….

创建pod

我是创建了一个CJSegment文件夹。来分辨我到底在干什么…因为本人有时候有点迷糊,搞着搞着名字一样就会晕头转向,我的目标podname是CJSegmentController
进入CJSegment目录中

terminal中执行:

1
pod lib create [pod name]

我的命令:

//pod lib create CJSegmentController

我记得当时输入命令后,会提示给你要怎么创建pod

1.选择使用语言[Swift/ObjC]

2.是否含有Demo[Y/N]

3.好像是view自检..(这个记不太清了)

4.选择test Framework [Specta / Kiwi / None] / (这个也没搞清楚都是什么样式,回头需要查询一下)

随后pod在CJSegment目录下生成了刚才输入的CJSegmentController文件夹,下图

到此pod创建完毕,该进行下一步了

填充pod

起名一直是编程人员的痛点。就叫填充pod好了。哈哈。

请把您想放入pod中的文件放置到上图的Classes路径下。Assets目录是放置资源文件的地方。

这里遇到了个坑。我算是中度storyboard拥趸,在我没研究pod私有库之前我认为storyboard是可以放置到pod中的。结果在校验的时候报了bug…提示不能这么干。我说怎么基本上没见到三方pod中还有storyboard的,好吧。只能改代码了…可能是pod为了开发者用起来方便吧。而Storyboard还需要找sb来创建viewController。当然还是有方法使用xib的。

代码改好也测试完了。塞进去就好了。如果定义了有Demo,请顺便把Demo也完善一下。

然后我们来进行下一步,创建该pod的仓库。

前文提到了pod是根据podSpec文件中的resouce tag来寻找该版本的pod,所以如果想发布到pod上这里用public git。

我去github上创建了一个空git 命名为CJSegmentController,同样没有license/readme原理同上,gitignore可以选填。
改好readme文件推到该git上。

git在这里不多说了。如果老哥对git不熟请移步廖老师的git教程,个人认为廖老师的教程很好,但用好重要还是在于多练。

此时如果到CJ/ 和CJSegmentController/目录下使用git remote -v查看git源发现这两个git地址应该是不一样的。因为前者是私人仓库的地址,后者是你创建的三方库的地址。之前就迷糊在了这里,强行坑了自己半天。

下一步,修改podSpec即pod配置文件,如果老哥使用了xib的话。xib是在资源文件中的。可以扔到Assets中,解注s.resource = “pod/Assets/xx.xib”,也可以放到Classes中。其他的字段也没什么好说的。相信老哥会用pod都明白是什么意思。*.{h,m}是一个类似正则表达式的字符串,表示匹配所有以.h和.m为扩展名的文件。例如

1
s.source_files  = "CJSegmentController/Classes/**/*.{h,m}"

我的podspec如下:

至此pod制作相当于完成了。

校验刚做好的pod

到CJSegmentController的目录下。

Terminal执行

1
pod lib lint --verbose

随后的pod 命令最好是带上–verbose来输出信息。这样可以打印出来详细的错误信息,便于老哥定位错误位置。

The following build commands failed:
CompileStoryboard /Users/CarlJi/Documents/job/CJSegmentController/CJSegmentController/SegmentController.storyboard
CompileStoryboard /Users/CarlJi/Documents/job/CJSegmentController/CJSegmentController/SegmentController.storyboard

  • ERROR | license: Sample license type.
  • ERROR | [iOS] file patterns: The source_files pattern did not match any file.

#s.license = “MIT (example)”
s.license = { :type => “MIT”, :file => “LICENSE” }

这个就是我之前用Storyboard报错,提示没有找到这个SB文件,这就说明podSpec文件中的source那里出了问题,去改吧~~

如果验证无误就可以进行下一步。 将CJSegmentController push到remote上,打好tag。 我设置的tag是0.1.0,你可以按你自己的喜好0.0.1/1.0.0都可以。

terminal执行校验操作:

1
pod spec lint CJSegmentController.podspec

成功后CJ(私人仓库)路径下会出现一个CJSegmentController文件夹(就是我们刚创建的),里面有存储podspec文件,跟master中的形式相同。

至此私有仓库搭建完成。在podfile中使用cocoapods/master那行的格式来增加私有仓库的git地址即可。

发布到Cocoapods

这个发布博客很不错

目前cocoapods使用trunk来管理大家pod的发布。

1.注册trunk
pod有最低版本限制,如果希望设备上有多版本pod请查看之前的Cocoapods文章安装RVM。

注册trunk

1
pod trunk register [name] 'description' --verbose

name使用Email来代替。命令执行成功后pod 会向邮箱发送一封邮件

点击链接即可完成注册流程。

terminal执行如下查询自己的信息:

1
pod trunk me

当然,如果你的pod是由多人维护的,你也可以添加其他维护者:

1
pod trunk add-owner CJSegmentController xx@xx.com

至此步-Pods:应该是空的…这里我是后截的图。

通过trunk上传podspec文件

进入之前校验生成的pod目录中 : CJSegmentController目录下生成的0.1.0文件夹

1
pod trunk push CJSegmentController.podspec

该命令执行了如下操作:

因为上传成功会自动为你更新本地master库,等待一会就完成了。

告诉你的朋友吧!

如果要更新你的pod版本.需要到pod路径下更改代码,修改git的tag值并且在podspec中做出对应修改,然后校验,trunk push。

CJSegmentController地址
是一个ContainerSegmentViewController,解决了不同子ViewController上拥有不同的barButtonItem状态但显示在parentVC的navigationBar上异常的问题。

坚持原创技术分享,您的支持将鼓励我继续创作!