组件化开发之私有库制作以及常见问题

3,195 阅读6分钟

前言:这篇文章主要描述私有库的制作过程以及本人在使用过程中的一些问题和解决方案,提到组件化就不得不想到pods私有库相关的东西(当然组件化不局限于结合私有库使用,还可以做成静态库或者多target开发等方式,这里只讲解私有库相关的东西,稍后会出一篇组件化结合私有库实现组件化开发的方式)

私有库,顾名思义就是不想暴露给公共知晓的库,也可以说仅供公司或者个人使用的库,我们常用的第三方库管理方式是cocoapods,所有的第三方都有一个存放索引的源地址,也可以理解为公有库地址 https://github.com/CocoaPods/Specs 在终端输入 pod repo就能看到里面有个master,这个就是我们在安装cocoapods的时候,在本地创建的索引库,默认的第三方库文件都会从本地索引库先查找,如果本地索引库没有,就会从源地址中获取,这也是为何我们首次pod install第三方的时候慢,执行pod update或者 pod update xxx --no-repo-update的时候也会慢的原因。好了,废话不多说,下面开始进入正题(为了方便复制和查看,我会配上操作图以及对应的命令)

一:准备工作

1. 查看本地是否有了私有库索引文件

pod repo
终端操作:pod repo,会看到有个索引列表如下:

本地有的索引库
如果本地没有就只有master一个,我这里已经有了一个私有的,那么如何创建呢?请看下面:

2. 创建远程私有库索引(这里以在github上为例)

新建仓库

由于github私有库收费,我这里以public为例,实则是一样的。 一般命名为xxxSpec

远程创建私有库文件

点击create repository即可创建仓库成功 这里我们可以得到一个远程索引库的地址,下面要用

索引库地址

3. 添加本地私有库索引

添加本地索引库

终端执行命令 : pod repo add 本地索引库名称 远程索引库地址,后面的地址就是远程索引库地址,LWPrivateSpec即为本地索引库的名称,这个可以自定义,一般和远程库名称保持一致即可

查看添加是否成功

执行 pod repo后查看,本地私有索引库文件已经好了,到这里关于索引库的创建就完成了,下面开始进入私有库创建的环节

二:私有库创建

1. 创建远程仓库

方法和索引库创建一样,这里不在赘述

2. 将远程库拉取到本地

clone仓库

选择一个路径,将远程库clone到本地 git clone 远程库地址

为了测试需要,需要创建测试工程,方便对组件功能的测试

3. 创建工程

创建工程

4. 引入pod

进入工程目录,执行如下命令,创建空的pod文件 pod init

pod install

5. 创建podspec文件

进入本地仓库路径,执行如下命令

创建podspec

pod spec create 库名称这里库名称最好和仓库名称一致,也可以随便起,也就是日后pod 'xx库'这里要填写的名称

另外在.podspec同等路径下,创建Pod/Classess文件,最后的结构如下:

pod文件结构

之后的功能模块就放在classes文件下

三:podspec的编写及其相关依赖设置

1. podspec文件的编写

打开.podspec文件如下(截取部分):

podspec初始内容

这里主要注意一下几个点:

  • s.name: 库的名称
  • s.version:版本号
  • s.summary:摘要
  • s.description:描述部分,要比摘要长
  • s.homepage:源地址,也就是私有库对应的远程地址
  • s.license:执照,一般选择默认
  • s.author:作者名称
  • s.platform:支持平台
  • s.source:来源
  • s.source_files:文件路径
  • s.framework/s.frameworks:依赖的系统的framework
  • s.dependency:依赖的库

修改后的podspec

这样提交后,引用时会发现,所有的.h,.m文件都在Classes文件下,我们看到有的第三方文件管理会出现分层

第三方分层

像这样有几个子库,比如我们想要用WXPay,那么在podfile中只需要引入pod 'YGFunctionComponent/WXPay'即可,那么这种是如何设置的呢?下面讲述:

2. 分层文件的编写

文件分层

这里有三个子库,每个子库中都可以只编写自己的功能,当然子库之间也可以依赖,这个后面再讲

分层编写的podspec

子库创建主要依赖于subpec 要注意的是 do 和 end 要成对出现,不然验证的时候会报错 也许你已经注意到,子库中也可以设置各自的依赖,还有一点要注意,父库的source_files设置要么去掉,要么就变化,不能再是Pod/Classess/**/*.{h,m}的格式,否则分层是没用的,比如我们想要在父库中有一个头文件xxx.h,需要这样设置:Pod/Classes/xxx.h

头文件引入

导入后的结构如下:

分层目录

3. 子库间的依赖

比如:我在LWFunctionComponent中有一个Utils的子库,在LocationTool中用到了Utils这个子库,那么该如何设置呢?

子库之间的依赖

xx.dependency "库名称/子库名称"

4. 私有库之间的依赖

和依赖第三方库一样 s.dependency "私有库名称

5. 验证过程

首先是要提交到远程并打tag值 git add .

git commit -m "xxx"

git push

git tag xxx这里的tag要和podspec中的保持一致,否则会报错

git push --tags

5.1 本地验证 pod lib lint

5.2 远程验证 pod spec lint

6. 添加到私有库索引

pod repo push 本地私有索引文件名 库名称.podspec

当然如果只是上面的写法你会发现会遇到很多问题,在第三点中我会列出一些常见的问题以及解决方案

三:验证过程的问题及其解决方案

  1. tag值导致的问题,这里再次强调,一定要注意git所打的tag值一定要和podspec中的保持一致
  2. 警告导致的问题,提交的时候你会发现很多-WARN开头的,如果你按照的是pod spec lint或者pod lib lint,那么一定会报错,这个时候只需要加上--allow-warnings即可解决
  3. 依赖第三方库导致的报错问题,只需加上--use-libraries即可解决
  4. 私有库依赖私有库找不到的报错问题,一般情况下会默认从master或者官方的spec源地址https://github.com/CocoaPods/Specs中去查找依赖库文件,而私有库是查找不到的,所以解决方法如下: --source=私有库源地址,官方库源地址即可

注意:上面的2,3两点错误在添加私有索引的时候,也要加上--use-libraries --allow-warnings这样的标识,否则也会报错哦

结束语:写了两个多小时,最后的问题以及解决方案模块实在不想再截图了,如果有需要后续会慢慢补上,敬请谅解 如果有其他问题,可以留言或评论区讨论

此外如果提交公共仓库开源出来,当然需要注册一个trunk喽,注册方式如下:

1.pod trunk register 邮箱 '作者名称’ --verbose
这里的作者名和podspec中设置的s.author保持一致 2.去邮箱验证即可