参照学习链接:
1.iOS组件化----Pod私有库创建及使用 - 简书
2.iOS 组件化开发(一):远程私有库的基本使用 - 云+社区 - 腾讯云
3.iOS 组件化开发(二):远程私有库的更新与子库 - 云+社区 - 腾讯云
4.iOS 组件化开发(三):加载资源文件 - 云+社区 - 腾讯云
5.iOS 组件化开发(四):fastlane实现pod自动化 - 云+社区 - 腾讯云
6.滑动验证页面
7.滑动验证页面
查看本地仓库:pod repo
移除本地私有索引库:pod repo remove ZZPublicSpecs
添加本地私有索引库:pod repo add ZZMakeSpecs https://github.com/UserZhangXiaoZhe/ZZMakeSpecs.git
步骤一:创建私有的pod索引仓库:
1、在公司的git服务器上创建私有远程索引仓库。克隆地址。
如:https://gitee.com/wangpeng14/WPTestPod_Specs.git
2、新建pod spec索引仓库(将私有的远程仓库copy到本地)。命令如下:
pod repo add TestPodSpecs https://gitee.com/wangpeng14/WPTestPod_Specs.git
TestPodSpecs:为pod spec索引仓库名称
3、执行完毕后,在目录:/Users/admin/.cocoapods/repos 下会多出来一个TestPodSpecs文件夹,可使用pod repo命令查看。如下:
至此,私有远程索引仓库TestPodSpecs生成完成
步骤二:创建私有组件库:
1.在公司的 git 服务器上面创建 组件 的 git 远程仓库,克隆地址是:https://gitee.com/wangpeng14/PrivatePermissionTools.git
2、创建私有的pod组件库(如PrivatePermissionTools权限组件),执行如下命令:pod lib create PrivatePermissionTools。过程中需要填一些选项,按需选择即可。如下:
pod组件空模板创建成功后会自动打开工程。
3、删除ReplaceMe文件,将需要封装的文件(如网络组件相关文件)复制到PrivatePermissionTools/PrivatePermissionTools/Classes中。如下:将LeelenNetworkManager复制到Classes中。(注意:需要cd到Example文件下 然后更新 pod update --no-repo-update)
4、修改 PrivatePermissionTools.podspec 文件如下:
5、校验本地索引文件 PrivatePermissionTools.podspec
cd到PrivatePermissionTools.podspec所在文件夹下,执行pod lib lint --allow-warnings,该命令是检查本地索引文件是否符合推送规则。成功了会打印PrivatePermissionTools.podspec passed validation。如下:
pod lib lint参数解析:
--sources:需要引⽤的spec,默认只依赖master,如果当前pod依赖了私有库,需要将其对应的spec包含进来,不然会报找不到对应库的问题。参数可以是本地spec的名称,也可以是git地址。
--allow-warnings:有警告会通过不了,如果警告是⽆关紧要的,可以加上,让检测通过。
--verbose:打印详细的检验过程
--use-libraries:⼯程或者依赖⾥⾯了静态库(*.a⽂件)或者是framework
备注:
pod lib lint 表示在本地校验索引文件
pod spec lint 表示在本地和远程都校验索引文件
6、将PrivatePermissionTools本地组件库与远程的仓库git关联起来
7、上传 PrivatePermissionTools.podspec 索引文件到我们的私有远程索引仓库 TestPodSpecs,命令如下:(进入到PrivatePermissionTools.podspec目录)
pod repo push TestPodSpecs PrivatePermissionTools.podspec --allow-warnings
上面命令对 PrivatePermissionTools.podspec 文件做了两个操作:一个是将其推送到私有的远程索引仓库,可以去公司的 git 上面 TestPodSpecs 索引仓库中查看;另一个是将其 copy 到私有的本地索引仓库,这个可以去目录:/Users/admin/.cocoapods/repos/TestPodSpecs 下查看到。
至此私有的组件库PrivatePermissionTools就创建完成了,可以在终端执行 pod search PrivatePermissionTools来查询它。
使用:
注意事项
1、操作的时候,先cd到对应的文件夹下
2、注意操作顺序
a、在develop分支开发、修改PrivatePermissionTools代码,修改 PrivatePermissionTools.podspec版本号,提交。
b、将develop分支合并到master。
c、在master打tag(如:1.0.1),注意这边的tag应与 PrivatePermissionTools.podspec中的s.version 版本号一致。
远程私有库的更新:(cd 到本地仓库的位置,执行以下操作)
一、更新远程仓库
1.代码更新
2.版本更新(版本更新 这一步非常重要,为更新索引库做准备)
版本升级
查看远程仓库,标签数已经有2个了,点进去就可以看到0.2.0,这里我们就不去看了
二、修改描述文件并更新索引库
1、修改Sepc
2、验证远程Spec
cd到xxxx.podspec所在文件夹下,执行pod lib lint --allow-warnings
3、更新索引库
pod repo push 索引库名称 xxx.podspec --allow-warnings
依赖第三方库:
当我们的私有库需要依赖其它第三方才可以正常使用时,我们就需要在spec文件中开启依赖,例如下面所示代码,表明当前仓库需要依赖AFN和SDWebImage
s.dependency 'AFNetworking', '~> 3.2.0'
s.dependency 'SDWebImage', '~> 4.3.3'
问题:但是这里存在一个问题,如果来了一位新的小伙伴,他所负责的部分只需要LXFBase下的Category,而LXFBase下的Cache才需要依赖SDWebImage,此时他若是pod一整个LXFBase岂不是平白无故安装了第三方依赖库,那应该怎么做呢?
答案:方案就是可以通过子库Subspecs来解决因需要一个小小的工具而依赖整个基础组件的问题
子库Subspecs:
什么是Subspecs?这里我们可以搜索一下SDWebImage。
Subspecs:
可以看到,如果我们只需要用到SDWebImage中的GIF功能,那么并不需要将整个SDWebImage都下载下来,在Podfile中将pod 'SDWebImage' 改为 pod SDWebImage/GIF即可单独使用这一功能
那接下来我们就来看看怎么描述一个子库吧
子库格式:
因为这里已经分离出子库了,所以s.source_files和s.dependency就不能这么使用了,需要我们在子库里分别指定,所以我们直接把原来的s.source_files和s.dependency都注释掉。写法参考如下:
修改后再按之前的步骤更新索引库和组件库就可以了。
ps: 在添加第三方依赖描述后做验证或者上传操作可能会很慢,因为它在克隆第三方库如SDWebImage,有兴趣的可以在命令后面加入--verbose来查看详情情况
使用子库:
组件库中带有图片资源:
1、将LoginImage文件夹放入/LeelenNetwork/Assets中,其中LoginImage文件夹内有[email protected]图片;
2、 修改LeelenNetwork.podspec索引文件
3、修改完spec索引文件之后,执行pod lib lint --allow-warnings检查本地索引文件是否符合推送规则。校验没问题后,SourceTree提交代码,打tag(tag注意与LeelenNetwork.podspec文件内的s.version一致)。执行pod repo push LeelenIotPodSpecs LeelenNetwork.podspec --allow-warnings操作,上传 LeelenNetwork.podspec 索引文件到我们的私有远程索引仓库 LeelenIotPodSpecs。
4、修改工程中的Podfile文件,cd到工程Podfile文件所在位置,执行pod install
5、pod install成功后,可以看到工程中多了一个Resources文件夹,里面有[email protected]图片,路径如下:Pods/LeelenNetwork/LeelenNetwork/Assets/LoginImage/[email protected]。以及Products文件夹下多了一个NetworkLog.bundle,查看包内容,发现里面也有[email protected]图片。
6、使用时,先拿到最外面的bundle,然后再去找下面指定名字的bundle对象,再搜索具体资源。如下:
NSBundle * currentBundle = [NSBundle bundleForClass:self.class];
NSURL * bundleURL = [currentBundle URLForResource:@"NetworkLog" withExtension:@"bundle"];
NSBundle * resourceBundle = [NSBundle bundleWithURL:bundleURL];
UIImage * logoIcon = [UIImage imageNamed:@"login_logo" inBundle:resourceBundle compatibleWithTraitCollection:nil];