iOS组件化实现

作者: Gui晨曦遇晓 | 来源:发表于2019-01-17 09:28 被阅读680次

    组件化简介

    想要做组件化的前提当然得知道什么是组件化。顾名思义,组件化就是将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 然后将需要的文件放入PSGTools/PSGTools/Classes/目录下(具体的组件化分类我就不谈了,请看上面大佬们的链接吧),这里我就随便拖几个文件进行演示了,并删除ReplaceMe.m文件。 87FFDE76-60BC-4A92-925E-D0594A39F678.png 接着进入终端cd到Example目录下执行pod install,就能看到放入在Classes目录下的文件已经可以在pods下看到了,例如: 3DDB17D8-810C-457F-8E79-2972C9B73646.png

    编译PSGTools工程,如果导入的文件还依赖于第三方库,在podfile文件中添加需要的三方库并pod install即可,工程编译通过就OK了。

    然后在主项目中的podfile文件中添加

    pod 'PSGTools', :path => 'PSGTools所在的目录'
    
    终端执行pod install,就能看到主项目中多了以下依赖 7A7D95AE-E9B4-4132-8695-D41E68A7C26D.png

    如果主项目中有重复的文件,需要删除主项目中的重复文件,然后编译运行通过就可以了,这样本地的就已经弄好了。

    本地私有库和远端的连接(我这里使用的是码云的远端库管理)
    1. 选择新建仓库,仓库名称要与本地私有库一直,我这里是PSGTools,然后选择勾选私有,下面有勾选使用什么进行初始化,一个都不要勾选,点击创建,然后就可以看到以下命令行教程,我们选择已有仓库的命令行进行操作。 B181F2DE-0555-47FB-8A28-AC56DBB3A96E.png 1B68283B-FFA1-4567-8DAC-6F8AE53752A1.png
    2. 依照已有仓库命令行进行操作,打开终端,cd到私有库的目录下
    cd xxxxx/PSGTools
    

    输入

    git remote add origin https://gitee.com/xxxx/xxx.git
    

    再输入

    git push -u origin master
    
    1. 刷新码云界面就可以看到已经上传上去了,但是这还没完,我们看到码云上面的PSGTools/Classes/目录下还是只有ReplaceMe.m文件,说明在终端并没有提交我们修改过的内容,继续回到终端执行以下命令
    git add .
    git commit -m '这里输入你要的提示的内容,例如:初始化'
    git push origin master
    

    这样我们就能在码云的Classes/目录下看到我们需要的内容了。

    1. 打开PSGTools.podspec文件,然后修改以下相对应的内容 FE09C588-06D9-4A67-8205-2969B0F94F63.png
    2. 然后进入终端在PSGTools目录下对框架打tag标签,要对应.podspec里面的s.version

    cd xxxxx/PSGTools
    git tag 0.1.0
    git push --tags
    
    1. 以上所有事情都做完了以后,剩下的就是将私有库的.podspec文件上传到本地Spec Repo。

    这里要说一下Spec Repo

    93D2A620-DD93-4334-AA61-CCA587CCCC08.png

    看到上面文件夹显示,repos目录下默认只有master文件夹的,在终端中输入命令"pod repo"可以看到对应的master。

    • 现在我们需要使用自己的Repo管理自己的私有库框架,创建步骤如下
      1. 到码云平台创建一个新的仓库,例如PSGSpec,就可以拿到仓库地址:https://gitee.com/PSG/PSGSpec.git
      2. 然后在终端输入以下命令
      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
      
      1. 这样就成功的创建了私有库管理仓库,可以到home目录下的/.cocoapods/repos目录下看到对应私有库名称的文件夹了,在终端使用"pod repo"命令也可以看到相对应的文件名称
    1. 私有库管理仓库创建好了之后就可以将私有库的.podspec文件上传到私有库管理仓库了
      1. 先验证.podspec文件是否可用,如果有任何WARNING或者ERROR都是不可以的,它就不能被添加到Spec Repo中,不过xcode的WARNING是可以存在的,验证需要执行一下命令
      pod lib lint
      避免警告pod lib lint --allow-warnings
      
      1. 再验证远程仓库,验证需要执行一下命令
      pod spec lint --allow-warnings
      
      1. 最后提交.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)`
      
    说明是没有找到对应的库,因为默认是去GitHub上面去找的,但是我们现在这里的库是放在码云gitee上面的,如果需要让他去码云gitee上面去搜索我们的私有库,就需要在podfile文件内容最上面配置资源库地址。 C8B8B6E0-DD38-488B-8A0A-4B009D50C287.png

    打开终端执行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'
    
    例如我这里是这样子的 8684A146-2F12-4233-A1B5-162C0D88A6B3.png

    这里为什么写上了自己的私有库地址之后还得加上cocoapods原有的库地址呢?因为如果加上了自己的资源地址之后,就只会在你添加的资源地址里面去寻找资源,但是我们项目开发中除了使用自己的私有库之外,经常还要使用到GitHub上面的公开库资源,所以要配上Github公开库资源地址。另外,如果我们有需要其他小伙伴的私有库资源,就需要再加上其他小伙伴们的资源地址。

    加上了资源库地址我们就已经完成了,可以进行组件化的划分了,具体是按照什么来划分组件化的,可以查看最上面的那几个链接,看看大牛们是如何阐述组件化的。

    相关文章

      网友评论

        本文标题:iOS组件化实现

        本文链接:https://www.haomeiwen.com/subject/ezxddqtx.html