代码管理 | 创建并管理自己的公有Cocopods库

前言

随着项目的发展,版本迭代,代码的重构,我们项目中一般会有很多有业务功能行性公共的组件,
app中可能多处都会使用到,甚至别的项目中也需要使用。比如我们 A 项目中有一个语音评测的功能,
前期只是在 A 项目里面需要用到,后面在另一不同项目绘本阅读需要用到相同语音评测的功能。
此时我们一般有两种做法,

一是直接将这部分代码copy到绘本阅读这个项目中; 二是将语音评测这部分逻辑给抽取出来,然后在分别在两处使用

很明显在项目初期,或者时间紧迫的情况下,第一种方式很好的能够胜任工作,我们前期也是这么做的,

但是我发现到了随着项目的推移和发展,这样做的时间成本太大了,效率也很低下,有很多隐患(评测逻辑一旦有变动,你需要改动两次,而且你没法保证两次的改动一致)。

所以把公司的公共组件抽离出来,使用 Cocoapods 集成管理是一种非常好的解决方案,这样的话,后续只要维护更新好这个公共组件,所有使用到的工程 pod install/pod update 下即可使用到最新的版本,达到一处更改多处使用的效果而且工程管理更加高效。

一、注册CocoaPods账户信息

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

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

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

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

# pod注册信息,开源pod库
pod trunk me 

二、创建共享库的文件仓库

这里从头创建一个共享库,以便对整个创建过程更加清楚。在terminal中创建一个全新的工程。这个文件仓库是你公共类库的维护仓库,新版本和修改可以通过这个仓库发布。

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

A. 共享文件夹(文件夹存放着你要共享的内容, 也就是其他人pod得到的文件, 
  .podspec文件中的source_files需要指定此文件路径及文件类型);
B. LICENSE文件(默认一般选择MIT);
C. 库描述文件.podspec(本库的各项信息描述, 需要提交给CocoaPods,
   pod通过这个文件查找到你共享的库,).
在terminal  中输入
$ pod lib create 新的库名

在创建库的时候,会询问你关于对新建库的一些要求,根据自己的要求配置好就OK,可以参考Using Pod Lib Create

这是我的设置

三、 配置好文件仓库后上传到公用仓库github | gitlab

把自己共享库需要的文件放置到工程中的指定位置

之后,将新建的项目push到远程服务端github | gitlab。具体的操作需要先在github上创建一个空的repo,然后使用命令行提交。

这里不用勾选即可

git add -A
git commit -m "first commit"
//这里替换成自己的 github上的项目地址
git remote add origin https://github.com/fangmeigithub/JWJOpenServe.git 
git push -u origin master

提交成功后,github上面的新建工程变为类似下图这样的样子。

四、编辑并验证 .podspec文件

这里也有俩值得注意的地方;

s.version          = '1.0.0'  //这里的版本和之后提交到github上的release 版的tag必须一致
s.summary          = '進无尽的公开库'  //这里必须修改,不修改的话下面的验证时会报错

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

pod lib lint JM_ActionSheet.podspec

不修改 s.summary 就会报错

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

修改 s.summary后验证通过

五、给文件仓库打tag, 发布一个release版本

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

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

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

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

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

pod trunk push JWJOPenKit.podspec 

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

至此,你的共享库就可以被其他人通过 Cocoapods 所使用了。

七、更新维护podspec

如果有错误或者需要迭代版本,修改工程文件后推送到远端仓库后, 需要修改podspec中的版本号, 并重新打tag上传, 再进行新一轮的验证和发布, 当然, 创建一个演示demo工程供其他开发者下载查看并不会影响我们的pod库。【在示例文本库中制作演示demo好像需要导入组件的源文件,使用 pod好像导入不进来,无法直接使用。当然你也可以把组件源码文件库和Dome分开,把 Dome作为对外公开的工程演示用例】

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

当你发布共享库成功后,是可以马上供其他人使用的,但是当你自己使用 pod search XXX的时候却发现本地搜索不到:

解决办法: 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! 稍等片刻就会出现你想要的结果~


参考文章

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

提高Linux安全性:14项检查建立安全的Linux服务器

1 – 记录主机信息 每当您正在使用新的Linux主机进行安全增强时,您需要创建一个文档并记录本文档中列出的项目,工作完成后,您将需要检查这些项目。另外,在开...

35660
来自专栏Java架构沉思录

10分钟了解ZooKeeper

ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

12320
来自专栏程序员互动联盟

Git 使用技巧

与其他技术相比,Git应该拯救了更多开发人员的饭碗。只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷...

31450
来自专栏FreeBuf

基于Tor网络的钓鱼邮件分析

五月十一日,我们的蜜罐系统捕获到来自xxxxxxxxx@uscourtsgov.com邮箱的钓鱼邮件。其中uscourtsgov就已经是一个很唬人的服务器名称了...

15000
来自专栏轮子工厂

Windows和Ubuntu系统如何远程连接Linux服务器

因为很多实验都要在工作站上面运行,为了避免拿着装着数据的硬盘在自己电脑和工作站之间来回跑,我简单总结一下在windows和Ubuntu系统下远程访问Linux服...

55240
来自专栏FreeBuf

弹性边界:如何利用环境变量进行提权

简介 尽管进程都设置了环境变量,它们往往被用户,开发者甚至是系统本身所忽略。对于一个像样的系统来说,环境变量就是其最根本,这里的系统包括但不仅限于Unix (...

32370
来自专栏程序员同行者

centos7安装python的MySQLdb模块

14220
来自专栏大魏分享(微信公众号:david-share)

如何构建一个安全的Glusterfs分布式文件系统集群?

40140
来自专栏古时的风筝

Maven 私服的简单使用

当我们再 pom 文件中依赖了某个包后,如果在没有做特殊配置(也就是使用 maven 的默认配置)的情况下,Maven 会首先到本地仓库去搜索,如果本地仓库没有...

7900
来自专栏FreeBuf

一款功能丰富的Perl后门程序分析

最近通过Cowrie蜜罐捕获一枚有趣的后门程序,此程序用perl语言编写。功能包括:DDoS(udpflood、tcpflood、httpflood、sqlfl...

416100

扫码关注云+社区

领取腾讯云代金券