我这篇和别人最大的区别,可能除了算是比较新的实践,还有就是对应的语言是Swift。
为什么需要打包私有库?
公司项目采用分支的方式进行“效率开发”,鉴于部分项目的基础功能一致,数据服务也保持了一致,所以在一开始这样的方式倒也没什么问题。But!!!随着项目的持续进行,各个客户定制类的要求差异化严重,采用分支的弊端逐渐显现:
- Base项目存在Bug,导致分支项目全部需要逐一修改,工作重复。(随着项目的增加,后期维护难度指数上升)
- 功能管理不可控,Base项目中经常有部分内容在分支项目中不需要。
- Base项目通过判断语句,将iPad和iPhone项目合二为一,存在一些项目早期不需要iPad端。(貌似后期App上架想加或想去除另一端会比较麻烦)
- 当有部分基础功能需要升级,就如同改代码一样需要处处分支进行更改。
- 虽然公司开发人员不多,流程也没有很完善,但是当自己尝试Jenkins做CI时,发现分支的方式对于一些配置非常不友好。
- ……
基于以上种种情况,便思考着如何改进,第一反应就是重构代码,重新组织架构项目。但是,当看了bang,casa,limboy等等大佬们组件化的思路之后有点懵懵的。最终,只能着手于从项目中抽出公共库或者业务库的思路着手,因此动手目标指向Cocoapods打包私有库。
计划是将一些基础公共功能抽离出来,方便以后所有类型的项目都可以使用,我司目前除了上文提到的Base项目并没有维护使用的库?。当前者完成,主要也是打通打包私有库这个流程之后,便着手抽取项目的业务功能模块作为库来使用。存在的问题是,还不太清楚是直接把逻辑抽离出来,还是连着UI一起(应该不太好)。最终就能做到通过这些私有库快速搭建项目,针对目前的项目也许还是需要一个Base项目进行一些基础配置(因为会用到一个第三方库)。
CocoaPods 打包进行时
默认打包前已经在电脑上配置好cocoaPods和Git环境,否则后续步骤在一开始就没法进行。关于Git环境配置网上一搜很多,至于正好自己之前写过一篇算是目前比较新的文档记录。
第一步,创建本地pod仓库
通过Pod命令可以创建一个本地仓库,会自带一些基础配置,只需要把自己的代码放在正确的位置即可完成私有库封装代码部分的内容。
pod lib create YourPodName复制代码
命令行执行完以上命令,会出现几个选项,根据自己的情况去做选择即可。提供自己的配置如下:
What platform do you want to use?? [ iOS / macOS ] > iOSWhat language do you want to use?? [ Swift / ObjC ] > SwiftWould you like to include a demo application with your library? [ Yes / No ] > YesWhich testing frameworks will you use? [ Quick / None ] > NoneWould you like to do view based testing? [ Yes / No ] > NoRunning pod install on your new library.复制代码
目前网上能查到的资料,好多都还有一项选择是统一配置类名前缀,不过目前我这个版本已经没有该选项。当上面执行完成之后会自动打开Example工程示例,接下来就可以进行具体的代码编写或者直接替换到对应位置。
第二步,修改Pod内容
打开创建的Pod库所在文件夹,在根目录位置有着 YourNamePod.podspec
和 README.md
两个文件,分别打开进行对应的修改。
YourNamePod.podspec 文件修改
鉴于是在创建私有库,本机的Git命令绑定的是GitHub,所以切记要修改文件里的git对应的地址到本地Gitd库地址!!!
Pod::Spec.new do |s| s.name = 'YourNamePod' s.version = '0.0.2' // 一定记得修改version!!!一定要和Git的Tag是相同!!! s.summary = '改成自己的summary s.description = <<-DESC 修改为自己库的描述内容 DESC s.homepage = '修改为自己本地Git库的地址' // 注意,这里的地址是本地库在浏览器上面的URL # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' s.license = { :type => 'MIT', :file => 'LICENSE' } // 默认MIT许可 s.author = { '用户名' => '用户账号' } s.source = { :git => '修改为自己本地Git库的地址', :tag => s.version.to_s } // 此处的地址,是从Git库copy过来的,以 .git 结尾。 s.ios.deployment_target = '9.0' s.source_files = 'Pod/Classes/**/*' // 原生的地址是 'YourNamePod/Classes/**/*', 但是这个地址在后面 的 pod repo push 中会出现问题,根据一个开源的库,修改了地址。注意,Pod 文件夹仍然是在根目录。 s.swift_version = '5.0' // 亲测,需要加上swift版本 end复制代码
README.md文件修改
README文件其实不用修改也无所谓,只是想着方便以后其他人了解这个库的使用,自己写了一些说明罢了。反正,如果有需要就看着加内容,或者看看自动生成的内容里是否有什么信息时需要删除的。
具体代码放哪里
具体代码当然得自己实现,但是放什么地方却是有讲究的,在上文有提过 s.source_files 对应的默认路径需要更改。自己库的代码就是要放在这个文件路径之下。如果按照我的步骤建立,则应该是在 Pod -> Classes 文件夹之中。
当打开示例项目进行测试验证时,首先需要 pod install
,然后正常打开项目。此时在 Xcode 中左侧面板 Pods下找到自己的 Pod 文件,再次确认下代码是不是都在,不在就 add 进来。接下来就是在示例工程中去进行各种尝试,每次对Pod文件里的代码进行了修改我都会重新 pod install
一次,然后 clean -> build。
第三步,Git部分
一开始说了需要本地有Git环境,现在就要用到了,在次之前先在本地的Git库中新建一个仓库(我司是用Gogs进行搭建)。注意!!!仓库名字与创建的 Pod 库名一致,不一致会不会有问题,我不知道,反正我没试过。记得!!!仓库不要设置成私有库,设置成为私有库在后面会出现问题,我找到的解决方案就是设置为public。
接下来,就是打开命令行 cd 到 Pod 库文件夹的根目录,进行以下命令的执行:
git add . // 跟踪所有改动过的文件git commit -m"提交内容"git remote add origin// 具体的url时没有 <> git push -u origin master git tag 0.0.1 // 需要与 .podspec 文件中的 s.version 对应git push --tags 复制代码
在这里需要注意的是,git 命令的执行,自己习惯了客户端,当使用命令行好像有些步骤问题。自己踩到的坑如下:
- 如果在第一次 push 之前对 Pod库文件夹里的内容进行了修改,貌似 push 的内容是最初没修改前的。
- 当多次 add -> commit -> push 之后,可能会出现
git ! [rejected] master -> master (fetch first)
这样的问题,解决方法是执行:
git pull origin mastergit push origin master // 如果执行之后还是没有即可成功,那么执行下面的内容git commit -m"xxx"git push复制代码
正常来说,应该就进行下一步的操作,如果在Git过程中遇到了坑,建议仔细看错误提示进行修改。
第四步,Pod 部分
Pod 部分的坑遇到不少,但是如果前面的步骤如果都有注意到细节,该修改的都修改了,那么下面的命令行执行起来应该是很顺畅。命令行 cd 至 Pod 库文件夹根目录,然后往下看⬇️:
pod repo // 检查 pod 库pod repo add YourNamePod// 添加到本地cocoapods中pod lib lint // 检测自己的 Pod 库配置 pod repo push YourNamePod YourNamePod.podspec // push 库配置// 成功之后pod search YourNamePod // 能够搜到就可以用起来了,这里可能有个小坑,那就是尽量在取名时取个唯一值,可以在Github上先搜一搜。私有库可能没啥影响,但是如果是公共的同名应该会有坑。复制代码
如果上述 lib lint
出现了红色warning提示,可以尝试在命令后面加上 --allow warnings。 至于其他的一些相关错误,根据信息提示搜一下基本都有解决方案,另外会在文末附上几个参考链接。
在其他项目使用的时候,podfile 文件里需要加上 source 路径,否则没法使用到私有库。
source "git-url.git" // 此处换成自己本地库的 urluse_frameworks!target 'TestPod' do pod 'YourNamePod', '~> 0.0.2'end 复制代码
第五步,最后就是维护!!!
到第四步成功结束,只是阶段性的胜利,之所以打包私有库除了方便使用还有就是后期维护更新!!!
后期功能更新或日常维护步骤如下:
- 修改 .podspec文件里的 version
- git 对应的操作:更新 push ,以及 tag 对应 version
- pod lib lint / pod lib lint allow--warnings
- pod repo push YourNamePod YourNamePod.podspec
至此,我所了解的一个闭环流程就结束了,希望以上内容有所帮助。
关于打包 CocoaPods 库Tips
- 对外提供的接口需要明确的声明 public ,否则即便能够
import ***
也无法使用接口方法/属性。 - 关于封装 MLog 日志时需要用到
#if MLOG
这样的预处理宏操作,但是不知道为啥在 Example 工程中做的配置(Pods 中 Targets 对应的地方做的配置)每次pod install
就自己清空了。如果有大佬清楚怎么设置,感谢不吝指教。
精选参考文档,并感谢!
我的还有点其他方面的整理,不适合大神,49年入国军的童鞋倒是可以去瞄一下。至于订阅,能保证的就是,我一定会更新下去?。