组件化简介
想要做组件化的前提当然得知道什么是组件化。顾名思义,组件化就是将APP拆分成各个组件(或者说模块也行),同时解除这些模块之间的耦合,然后通过主工程将项目所需要的组件组合起来。这样组件化过后的项目就变成了很多小模块,如果新项目中有类似的需求,直接将模块引入稍作修改就能使用了。
这种设计是不是很像引入三方库做快速开发?其实制作组件的过程就相当于做二方库。因此常见的组件化方案大多都是使用cocoapods做依赖管理。
优点:
- 降低耦合度。组件化抽取出来是一个模块,可以直接用pods进行管理的;
- 组件单独开发,单独测试。每个模块都可以由专门维护的人去进行单独开发,开发测试过程中,可以只编译自己那部分代码,不需要编译整个项目代码。
- 组件化后项目的代码结构更加清晰,维护更加方便快捷;
- 适合多人协助开发。各自负责维护各自的模块,明确团队开发的业务边界,增加团队协作效率。
缺点:
- 增加了代码的冗余;
- 增加了项目的复杂度;
- 版本同步问题。
组件化拆分:
- 基础组件拆分(宏定义、分类、工具类...)
- 功能拆分(数据库、网络框架、图片加载...)
- 业务拆分(登录、聊天、商城、社区...)
- Router(负责模块之间的业务往来)
具体关于组件化方面的解释请参考链接以下
利用cocoapods创建基于git的私有库Spec Repo,我这里以创建PSGTools为例
首先说一下本地私有库的实现
打开终端,cd到需要存放的目录下,pod lib create PSGTools,出现Cloning https://github.com/CocoaPods/pod-template.git
into PSGTools
.,然后等待几分钟,依次回答以下问题。
What is your name?
>这里输入名字,可以随便输
What is your email?
>这里最好是输入你gitee.com注册的邮箱
What platform do you want to use?? [ iOS / macOS ]
>iOS
What language do you want to use?? [ Swift / ObjC ]
>ObjC
Would you like to include a demo application with your library? [ Yes / No ]
>Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
>None
Would you like to do view based testing? [ Yes / No ]
>No
输入完成之后就会自动创建这么一个工程。编译PSGTools工程,如果导入的文件还依赖于第三方库,在podfile文件中添加需要的三方库并pod install即可,工程编译通过就OK了。
然后在主项目中的podfile文件中添加
pod 'PSGTools', :path => 'PSGTools所在的目录'
终端执行pod install,就能看到主项目中多了以下依赖如果主项目中有重复的文件,需要删除主项目中的重复文件,然后编译运行通过就可以了,这样本地的就已经弄好了。
本地私有库和远端的连接(我这里使用的是码云的远端库管理)
-
选择新建仓库,仓库名称要与本地私有库一直,我这里是PSGTools,然后选择勾选私有,下面有勾选使用什么进行初始化,一个都不要勾选,点击创建,然后就可以看到以下命令行教程,我们选择已有仓库的命令行进行操作。
- 依照已有仓库命令行进行操作,打开终端,cd到私有库的目录下
cd xxxxx/PSGTools
输入
git remote add origin https://gitee.com/xxxx/xxx.git
再输入
git push -u origin master
- 刷新码云界面就可以看到已经上传上去了,但是这还没完,我们看到码云上面的PSGTools/Classes/目录下还是只有ReplaceMe.m文件,说明在终端并没有提交我们修改过的内容,继续回到终端执行以下命令
git add .
git commit -m '这里输入你要的提示的内容,例如:初始化'
git push origin master
这样我们就能在码云的Classes/目录下看到我们需要的内容了。
-
打开PSGTools.podspec文件,然后修改以下相对应的内容
然后进入终端在PSGTools目录下对框架打tag标签,要对应.podspec里面的s.version
cd xxxxx/PSGTools
git tag 0.1.0
git push --tags
- 以上所有事情都做完了以后,剩下的就是将私有库的.podspec文件上传到本地Spec Repo。
这里要说一下Spec Repo
看到上面文件夹显示,repos目录下默认只有master文件夹的,在终端中输入命令"pod repo"可以看到对应的master。
- 现在我们需要使用自己的Repo管理自己的私有库框架,创建步骤如下
- 到码云平台创建一个新的仓库,例如PSGSpec,就可以拿到仓库地址:https://gitee.com/PSG/PSGSpec.git
- 然后在终端输入以下命令
pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
[Private Repo Name] 是你本地需要用来管理私有库的spec名称 [GitHub HTTPS clone URL]是你新建的这个管理私有库的仓库地址 例如:pod repo add PSGSpec https://gitee.com/PSG/PSGSpec.git
- 这样就成功的创建了私有库管理仓库,可以到home目录下的/.cocoapods/repos目录下看到对应私有库名称的文件夹了,在终端使用"pod repo"命令也可以看到相对应的文件名称
- 私有库管理仓库创建好了之后就可以将私有库的.podspec文件上传到私有库管理仓库了
- 先验证.podspec文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不过xcode的WARNING是可以存在的,验证需要执行一下命令
pod lib lint 避免警告pod lib lint --allow-warnings
- 再验证远程仓库,验证需要执行一下命令
pod spec lint --allow-warnings
- 最后提交.podspec文件到仓库
pod repo push PSGSpec PSGTools.podspec --allow-warnings
这样私有库的创建和配置就已经完成了,到主项目中的podfile文件中将
pod 'PSGTools', :path => '../iOS组件/PSGTools'
修改成
pod 'PSGTools', '~> 0.1.0'
然后在终端cd到工程目录下进行"pod install"
- 这里在使用"pod install"的时候会出现下面这种错误
PSGUI$ pod install Analyzing dependencies [!] Unable to find a specification for `PSGUtils (~> 0.1.0)`
打开终端执行pod repo,就可以看到我们的私有库管理库Spec Repo,master是cocoapods默认的,其他的就是我们自己创建的私有库,这里我的私有库资源库的地址是
https://gitee.com/G_Q/PSGSpec.git
在podfile文件中添加以下内容
source 'https://gitee.com/xxxx/xxxx.git'
source 'https://github.com/CocoaPods/Specs.git'
例如我这里是这样子的这里为什么写上了自己的私有库地址之后还得加上cocoapods原有的库地址呢?因为如果加上了自己的资源地址之后,就只会在你添加的资源地址里面去寻找资源,但是我们项目开发中除了使用自己的私有库之外,经常还要使用到GitHub上面的公开库资源,所以要配上Github公开库资源地址。另外,如果我们有需要其他小伙伴的私有库资源,就需要再加上其他小伙伴们的资源地址。
加上了资源库地址我们就已经完成了,可以进行组件化的划分了,具体是按照什么来划分组件化的,可以查看最上面的那几个链接,看看大牛们是如何阐述组件化的。