将项目中公共组件使用Cocoapods管理实战
想直接操作上手的请略过前言部分,直接阅读正文部分;
建议不要错过精彩的前言哦,或许你看了对你有所启发。
前言
随着项目的发展,版本迭代,代码的重构,我们项目中一般会有很多有业务功能行性公共的组件,app中可能多处都会使用到,甚至别的项目中也需要使用。比如我们FCS项目中有一个语音评测的功能,前期只是在FCS项目里面需要用到,后面在另一不同项目绘本阅读需要用到相同语音评测的功能。此时我们一般有两种做法,一是直接将这部分代码copy到绘本阅读这个项目中;二是将语音评测这部分逻辑给抽取出来,然后在分别在两处使用。很明显在项目初期,或者时间紧迫的情况下,第一种方式很好的能够胜任工作,我们前期也是这么做的,但是我发现到了随着项目的推移和发展,这样做的时间成本太大了,效率也很低下,有很多隐患(评测逻辑一旦有变动,你需要改动两次,而且你没法保证两次的改动一致)。正确的做法是在适当的时间应该立马进行代码重构,将这部分重复的代码给抽取出来。至于重构的准则就是三次法则,出自Martin Fowler《重构改善既有代码的设计》,这本书真的推荐大家一看,程序员必读的书籍之一。扯远了。。。
于是我花了几天时间将语音评测这部分逻辑给抽取出来,建立了一个公共组件SpeechEvaluationKit
,在两个项目中都能够方便的使用,并且使用Cocoapods来管理。公司项目的核心代码存放在Coding上,包括SpeechEvaluationKit
的代码,这部分代码我们是不能够公开的,所以我建立的是私有库(Private Pods),也是本文实战操作所建立私有库管理;相对应的当然就有公有库,这部分的代码不仅可以自己使用,还可以开源出来。
正文
关于CocoaPods的介绍、安装、使用说明请查看官方文档,同时本文的操作也是根据官方文档介绍来完成的。
如下图,项目的目录结构如下图:
- 新建[项目名].podspec
使用命令:pod spec create '项目名'
、pod lib create '项目名'
。
现有的项目,在项目根目录运行终端命令:pod spec create 'SpeechEvaluationKit'
,根目录下将会生成一SpeechEvaluationKit.podspec
文件。
如果还没有创建项目,则使用pod lib create 'SpeechEvaluationKit'
,这一步会让你填写一些信息比如使用swift还是oc、是否使用测试框架等等,我的选择如下:
最终生成的的目录如下,新建项目写完代码后得将本地仓库添加到远程git仓库,关联命令为git remote add origin 远程仓库地址
- 配置podspec文件
Pod::Spec.new do |s|
s.name = 'SpeechEvaluationKit'
s.version = '1.0.0'
s.summary = 'SpeechEvaluationKit is a powerful voice evaluation library'
s.description = 'A powerful voice evaluation library,such as book reading, living and ips mission.'
s.homepage = 'https://git.coding.net/firstleap/SpeechEvaluation_iOS.git'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'XcqRomance' => 'xcqromance@163.com' }
s.source = { :git => 'https://git.coding.net/firstleap/SpeechEvaluation_iOS.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.source_files = 'SpeechEvaluationKit/Classes/**/*'
s.exclude_files = "SpeechEvaluationKit/Assets/**"
end
这个podspec文件包含的信息很重要,对于一个普通的pods库上面的信息就足够了,各个配置的含义基本都能够看得懂,比如name
代表你的pods库的名字,如果是公有pods库,可以通过pod search 'name'
来搜索查看;version
则代表版本号,一旦库有发布更新就通过修改这个版本号来发布更新;summary
和description
就是对pods库的简介和详细说明,这个根据库的功能来描述;source
一般填写代码仓库地址可以是git、svn、github的地址;source_files
代表你这个pods库包含的代码,一般就是我们编写公共组件的代码,文件的描述都是可以用一些匹配公式,比如上面用到的**和*;exclude_files
一般是除了代码之外的资源文件,比如图片、音频之类的;至于其他信息,你可以根据自己库的需求来配置,比如YTKNetwork是基于AFNetworking的封装,所以还添加了s.dependency "AFNetworking", "~> 3.0"
依赖。上面的这些信息必须读严谨的配置,否则在下一步验证的时候会出现警告甚至报错不通过。比如我之前的summary没有更改而是使用的模版信息,就出现如下警告:
- 验证podspec文件和项目(
pod lib lint Name.podspec
)
执行命令pod lib lint SpeechEvaluationKit.podspec
(后面还可以添加参数--verbose
,有助于出错的问题定位)
一般到这一步会遇到很多警告和错误导致验证不通过,此时不要心急,一个一个问题解决,在stack overflow寻找解决方案,你所遇到的问题,前人们很多都已经遇到过了。
验证通过提示信息如下:
一旦验证通过,你就离成功只有一步之遥了; - 建立tag,并且上传git仓库,tag版本和podspec文件的
version
版本保持一致就行了;git 常见命令传送门
git tag -a 1.0.0 -m 'pod私有仓库' #打tag
git push origin 1.0.0:1.0.0 #上传tag
- 发布项目到cocoapods官方仓库
等等...在这之前你得先有一个Cocoapods账号,也就是得先注册一个账号,执行以下命令:
pod trunk register romance.xie@firstleap.cn 'romance' --description='My working computer'
邮箱、名字、描述该为自己的就行,然后你将会邮箱会收到一封邮件,点击右键链接激活,然后通过pod trunk me
来查看自己是否注册成功:
如果是多人开发,只需执行命令:pod trunk add-owner '项目名' '邮箱'
将伙伴添加到项目中;
5.1 公有库的发布(即开源的,会将podspec文件上传到cocoapods官网,当执行pod install 或者 pod update的时候会根据配置文件取对应的源代码)
发布命令:pod trunk push 项目名.podspec
使用pod search 项目名
查看是否上传成功,下图是我们app中日志收集的公有库FLogKit
,pod search FLogKit
5.2 私有库的发布
发布命令:pod repo add '仓库名' '仓库地址'
如果是现有的项目,代码放在coding私有项目中,仓库地址直接填写第2步podspec配置文件的s.source
的地址,即执行以下命令即可:pod repo add 'SpeechEvaluationKit' 'https://git.coding.net/firstleap/SpeechEvaluation_iOS.git'
;
如果是新建的项目,即第1步中,使用pod lib create '项目名'
初始化的项目,就需要先在服务器建立一个私有仓库,我这里以在Coding中建立私有仓库为例,仓库建立好后将会有获得git仓库地址,
记得将写好的代码提交到Coding的Git仓库中,执行发布命令pod repo add 'SpeechEvaluationKit' 'https://git.coding.net/romance/SpeechEvaluationKit.git'
;
,
使用open ~/.cocoapods/repos
查看是否创建好私有仓库,一旦代码有更新,使用pod repo update
更新pod私有仓库,删除私有仓库pod repo remove '项目名'
。 - 使用组件
pod 'SpeechEvaluationKit', :path => '../'
,开发模式
pod 'SpeechEvaluationKit'
,稳定之后或者其他项目的使用
总结
看完本文知道Cocoapods管理公共组件是多么简单了吧,当然里面一些深入的内容需要在实际使用过程中才领悟了解。整个过程及其使用就只有五步:新建podspec文件->配置podspec文件->验证podspec文件和项目->上传tag->发布更新。这步骤你记住了么。
如果你觉得本文对你有帮助,就请你点亮底部的❤️吧,你的鼓励是我前进的动力!