私有库顾名思义是私有的,我在GitHub上使用的都是公开库,出于安全与机密考虑,公司级开发都是使用私有库。下面先说几个概念。
一、索引库
我们每创建一个组件都会带有一个 xxx.podspec 的索引文件,这个文件包含组建框架的描述信息、框架名称、版本号、真正的代码存放地址及框架源码远程地址。那么专门用来存放这些索引文件的库就叫做索引库。索引库有本地索引库和远程索引库之分。远程索引库就是放在远端,比如GitHub上。我们在终端上使用pod repo可以查看索引库的情况。如图,我们当前只拥有一个索引库,URL对应的是远端的地址,path是本地索引库的地址。我们本地的索引库实际上是通过pod setup命令下载下来的,我们通过pod search搜索私有库都是在本地的索引库进行搜索,所以本地索引库长时间没有更新会造成一些新的框架我们检索不到。使用pod repo update或pod setup更新即可。(点击查看spec的相关介绍)
1.下面分别在远端与本地找到相应的索引库。
远端:
本地的索引隐藏起来了,我们终端输入命令显示隐藏文件夹
defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder
2.在腾讯云上建立一个远程私有索引库。
3.这里我们再创建个私有索引库,通过pod repo add <本地索引库的名字> <远程索引库的地址> ,创建本地索引库并和远程索引库做关联,这里其实就是一个clone操作,执行完毕后,cocoapods
会把 spec文件
clone 在 ~/.cocoapods/repos
目录。(注:本地索引库的名字建议和远程索引库起的名字一样)。我们做关联后本地是没有spec文件的,这个需要后面执行pod repo push后才有。此时我们再打印发现有两个索引库了。
二、手动创建本地私有库(了解即可)
我们写好的组件框架放在本地,通过pod的方式找到我们组件 (这里我们是手动创建的demo与spec文件,比较麻烦。后面会重点介绍直接用模版库实现,所以这里大家了解下就行)
修改podfile文件与spec文件,注意相关地址的配置,最后使用pod install即可安装,pod install后实际上是引用本地的类库,最终并没有存在于我们的工程文件夹中。
三、远程私有库与本地私有模版库(重点介绍部分)
为了多人协作开发我们的私有库最终肯定要放在远程的。远程私有库建立过程就是把本地代码仓库放到远程仓库,我们这里提交的仓库里有我们demo和我们的组件框架,最终通过pod install加载组件框架到我们的实际开发项目中(具体加载过程是通过spec中source_file里的路径来寻找我们的组件的)。
1.远程代码仓库的建立
这里使用的是腾讯云托管的,因为它可以免费建立私有的仓库(以前叫码市)
2.本地代码仓库的建立
1).在终端输入命令:pod lib create <组件名> 创建本地代码组件模版库,组建名可以和远程代码库一致也可以自己随便写。
2).然后在Xcode彻底删除ReplaceMe.m文件,接着把自己封装好的组件化代码的文件夹拖入到组件文件夹的classes路径下。
3).接着cd到Example下进行pod install (把刚才拖入到classes里的文件夹pod进来,这里会通过podfile里面默认的设置:path => '../',自动把classes里的文件pod过去)
4).编译组件看是否报错,编译通过后需要修改podspecs索引文件,一般需要修改下面几个问题。
a. 修改版本号
b. 修改项目的简单概述和详细描述
c. 修改homepage和source地址
d. 添加依赖库
5). 编译运行通过后,提交组件到远程代码库并打tag.我们打的tag就相当于提交了一个版本。tag下的代码是当前分支下同步过去的,我们不能提交代码到tag下,所以每次更新版本必须打tag,不然我们pod索引到的不是你更新后的组件代码。
git add .
git commit -m “xxx”
git remote add origin 远程代码仓库地址
git push origin master 或者 git push -u origin master(一般第一次提交用)
git tag 版本号/git tag -a 版本号 -m “version 版本号”(注:这里的版本号必须和podspec里写的版本号一致)
git tag 查看版本号是否提交成功
git push - -tags
6).通过pod spec lint 命令验证podspec索引文件(注:pod lib lint是检索本地索引文件,pod spec lint 是本地和远程库同时检索) ,我在验证时很多次失败是因为tag和source_file的问题引起的,所以这两个一定要主要规范。这个验证过程会遇到一系列的报错,如果遇到有关静态库,frameWork等的报错,可以添加上 --use-libraries,如果因为警告不能验证痛过,添加 --allow-warnings。显示详细信息在前面添加 --verbose。(例pod spec lint --use-libraries --allow-warnings --verbose)
(对于不支持模拟器的库验证与上传时可能会遇到下面的问题,解决方案:https://www.jianshu.com/p/88180b4d2ab7/)
7).验证通过后,pod repo push <本地索引库> <索引文件名> 提交索引文件到远程索引库 (注:后缀与lint后的保持一致)。这个操作的实际过程是这样,首先执行命令之前我们的本地是没有那个索引库文件的,push之后会先出现在本地的索引库中,然后通过之前pod repo add关联的远程地址再推到远程索引库中,这里跟pod setup的过程刚好相反(例pod repo push FMSpecs FMBase.podspec --use-libraries --allow-warnings --verbose)。
如果push后遇到如下错误:(此时解决办法:pod repo add XZSpec https://git.dev.tencent.com/sacrifice123/XZSpec.git)
8). 接下来回到demo工程修改podfile文件,把FMBase组件pod进来(注:需要在Podfile中指定组件远程索引库地址,如果不指定默认会从master的索引库查找就会报找不到组件)
source 'https://git.dev.tencent.com/sacrifice123/FMSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
然后执行pod install ,项目运行成功即大功告成。
四、远程私有库升级与优化
1.更新升级
当我们修改或增加了组件框架以及依赖库,对我们来说就是一次更新升级,此时过程比较简单,我们需修改spec文件的version(版本加1即可)然后和修改的文件一起提交(注意在总文件夹里做提交,不要在Example和本地库文件里提交)。提交成功后我们要打tag,tag和spec的version对应即可,然后继续验证一下,最后执行 pod repo push XXX更新本地与推到远程即可。
2.分割出子库
当我们一个组件库里有很多子模块时,我们可以尝试分割出几个子库,分割完之后需重新打tag并上传。具体写法如下:
(这里有几个我遇到的坑,别名我用了大写,验证报错,改成小写就行了。还有就是end结尾我没换行,也验证不通过。另外注意依赖的添加,一个子库可以单独单独依赖另一个子库,但是子库之间不能循环依赖,不然会报circular dependency这个错误)
s.subspec 'Base' do |b|
b.source_files = 'FMBase/Classes/Base/**/*'
end
s.subspec 'Category' do |c|
c.source_files = 'FMBase/Classes/Category/**/*'
end
s.subspec 'Network' do |n|
n.source_files = 'FMBase/Classes/Network/**/*'
n.dependency 'AFNetworking'
end
s.subspec 'Tool' do |t|
t.source_files = 'FMBase/Classes/Tool/**/*'
end
另附,cocoapods简单总结:https://www.jianshu.com/p/71cb54b02355
http://www.cocoachina.com/ios/20180727/24338.html
https://blog.csdn.net/weixin_34240520/article/details/91186353(pod缓存)
组件的划分:https://www.jianshu.com/p/88b4168e1ce4