Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >教你从 0 到 1 如何实现组件化架构

教你从 0 到 1 如何实现组件化架构

作者头像
一缕殇流化隐半边冰霜
发布于 2023-06-09 07:06:57
发布于 2023-06-09 07:06:57
55700
代码可运行
举报
文章被收录于专栏:冰霜之地冰霜之地
运行总次数:0
代码可运行

前言

本篇主要讲解组件化架构思想,从零教你如何组件化一个项目,当然组件化也遇上许多坑,这里非常感谢小码哥王顺子老师的帮助。

为什么要组件化

  • 随着项目的不断迭代,各个模块会越来越复杂,各个模块相互依赖,而且每个模块可能会有共同的业务逻辑,导致整个项目维护起来比较麻烦。
  • 可以采用组件化,把每个业务逻辑和模块分离,单独管理,这样比较方便维护,各个开发人员只需要关心好自己的模块就好了。

组件化好处

  • 分工更加明确,提高开发效率
  • 复用性更好,能迅速的组成更多的App

组件化思想

  • 就好比封装控件,复杂的控件一般都会封装,组件化只不过是把每个模块单独抽出来,作为一个小工程,然后在组成一个一个完整的项目。

如何组件化

使用cocoapods管理组件化开发

podspec:描述自己组件工程的代码目录和资源目录在哪,还有自己组件工程所依赖其他框架,到时候就会根据podspec的指引去引入自己的仓库代码.

  • 命令:pod spec create spec文件名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 创建pod索引库,固定写法,并且定义索引库的名字为s,后续通过s,就能拿到索引库
  Pod::Spec.new do |s|

    // 设置名称
    s.name         = "HttpManager"

    // 设置版本号
    s.version      = "0.0.1"

    // 设置摘要
    s.summary      = "A short description of HttpManager."

    // 设置详情
    s.description  = "Good"

    // 设置仓库主页
    s.homepage     = "http://EXAMPLE/HttpManager"

    // 设置许可证
    s.license      = "MIT"

    // 设置作者
    s.author             = { "iThinkerYZ" => "690423479@qq.com" }

    // 设置仓库源,表示在哪可以找到组件工程
    s.source       = { :git => "", :tag => "#{s.version}" }

    // 设置 源文件路径 => 不是整个工程的文件,而是自己封装的代码,以后别的工程引入,就会引入这里的代码。
    s.source_files  = "HttpManager/Classes/**/*.{h,m}"

   // s.dependency = '' 组件工程依赖哪些第三方框架
   // s.frameworks = 'UIKit', 'MapKit' 组件工程依赖哪些原生框架
   // s.resource_bundles = {} 组件工程图片资源

  end
  • podspec文件注意点:s.source_files仅仅描述组件代码就好,不要描述整个工程名文件,会把所有文件集成上去,错误写法:s.source_files = "HttpManager"
  • **:表示所有文件:因为*表示通配符,可有可无.
    • s.source_files = "HttpManager/Classes/**/*.{h,m}",表示组件代码在podspec目录下HttpManager/Classes中的所有文件,默认会自动追踪到到podspec文件的目录路径下,因为当前处于podspec文件中,处于哪个文件,就自动追踪哪个文件。
    • HttpManager/Classes/a.h 匹配到的应该是HttpManager/Classes/**,表示HttpManager/Classes/a.h后没有东西,就不会在找,直接匹配到。
  • podspec文件注意点:s.description:不能为空
  • podspec文件注意点:s.license:不能乱填,必须是有这样的协议,比如(MIT)

podFile文件:指定主工程加载哪些组件库,里面描述好组件库对应的podspec文件在哪,就知道去哪加载组件代码。

创建命令:pod init

cocoapods可以加载远程仓库也可以加载本地仓库,一般加载远程仓库.

如何加载本地仓库代码?

本地仓库代码搞一个podspec文件描述去哪加载组件代码

谁需要引入本地仓库代码,就创建Podfile

Podfile:指定podspec文件在哪

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pod 'HttpManager' , :path => '../HttpManager'
  • ../HttpManager:回到Podfile上一级目录,进入HttpManager就能找到podspec
  • Podfile在哪,就自动跟随在哪级目录

Podfile文件.png

podspec文件.png

  • 创建组件工程
    • 方式一: 直接创建工程,把组件代码放在Class中,只要spec描述好,就会自动加载Class中组件代码
      • 生成spec描述文件,指定加载组件工程的组件代码在哪。
    • 方式二: 使用cocoapods命令:pod lib create 组件代码名称
      • 这个命令会自动生成一套组件代码工程测试代码,并且有Git管理
      • 还会生成podspec,描述好组件代码在哪就好.
      • 如何使用自动生成的组件工程代码?
        1. 需要把自己的组件代码放在Class中对应文件,还不够,发现根本没法引入组件代码.h文件.
        2. 需要重新pod install,因为不重新pod install,Example工程根本不知道Pod更新了,pod install的作用:重新让pod库与所依赖的工程文件产生关联。

Cocopods原理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    *    1.    根据Podfile描述,找到对应代码库的描述文件podspec
    *    2.    podspec中描述,去哪(s.source)才能找到代码库,并且找到之后,需要拷贝哪些文件(s.source_files)到自己的工程中。

如何组件化(公共远程仓库)

  • 问题:以上的代码仓库都在本地,没有远程管理,也就意味着只能自己使用,别人不能使用,如果想把自己的代码仓库开源,让所有的开发人员都可以弄,应该怎么做?
  • 把自己的仓库代码推送到cocoapods中索引库中就好了。
    • 原理:我们之前安装cocoapods时,有一步骤pod setup,这一步其实就是去下载cocoapods中公共的所有代码仓库索引,保存到本地
    • 通过pod repo 指令就能查看cocoapods的索引库

pod path.png

  • 如何把自己代码仓库上传到cocoapods上
    1. 给自己代码仓库,创建podspec,其实本质是把自己代码仓库的podspec索引文件上传上去就好了,可以直接使用pod lib create命令
    2. 自己仓库代码远程托管,并且公开,这样别人才能获取到你的仓库代码
      • 注意:远程仓库不需要创建gitignore文件,因为pod lib创建了
      • 提交自己仓库代码到远程仓库
      • git status : 查看状态,如果有不想要的文件,可以用gitignore忽略掉
      • 提交到本地缓存区 `git add .``
      • 提交到本地仓库 git commit -m ''
      • 查看远程仓库地址 git remote(查看有没有远程地址)
      • 绑定远程地址 git remote add origin 远程仓库地址
      • 推送自己代码到远程仓库 git push origin master
    3. 给自己仓库绑定Tag,因为cocoapods是根据代码仓库的Tag,去下载对应Tag的远程代码库的。
      • 给自己当前仓库版本添加Tag标签,git tag -a 0.0.1 -m '0.0.1',仅仅是本地
      • 把本地标签推送到远程服务器git push --tags
    4. 注册trunk
      • 注册trunk,不是任何人都能推送,因为cocoapods依赖trunk服务器管理,所以需要通过trunk推送自己的podspec(cocoapods官网
      • 命令:pod trunk register EMAIL [NAME]
      • [NAME]: 表示NAME可有可无
      • pod trunk register 58999050@qq.com yuanzheng
      • 验证成功后,点击邮箱就好了,打开会有点慢.
    5. 推送自己的podspec到cocoapods的索引库
      • pod trunk push HttpManager.podspec --allow-warnings
      • 注意:必须cd 进入到podspec目录下,才能执行这个代码
      • 注意:podspec文件中的s.version版本号要跟最新Tag一致
      • 注意:podspec文件中的s.source仓库地址也不能写错
    6. 测试能否索引到
      • pod search 自己仓库
      • 发现索引不到,其实已经上传到cocoapods上了,只不过需要重新更新索引文件
      • 怎么更新pod索引文件?
        • 原理:pod setup成功后会生成~/Library/Caches/CocoaPods/search_index.json文件
        • search_index.json文件文件删除,重新执行pod search,就会重新更新索引.

如何组件化(私有远程仓库)

问题:有些公司核心的代码不想开源,就不能放在cocoapods公共的索引库中,也不能放在本地,因为以后需要多人开发,cocoapods支持创建自己的私有索引库,只需要把自己的代码仓库放在自己的私有索引库就好了.

如何创建私有远程仓库索引库

  1. 搞个私有远程索引库托管平台
  2. 本地添加私有远程索引库: pod repo add XMGSpec
  3. 把自己私有库的索引添加到自己私有库种: pod repo push XMGSpec XMGLib.podspec --allow-warnings,本地索引库就会有自己的私有库,并且远程也会有,pod repo push会帮我们推送到远程索引库.

怎么使用自己的私有索引仓库

pod search 搜索自己库描述

pod install,发现找不到,因为默认是去共有的索引库查找

需要在Podfile文件顶部添加一个源,表示去哪个地方查找。

  • source 'https://git.coding.net/iThinkerYZ520/XMGSpec.git'

但是有问题,如果以后要添加公有的索引库,比如AFN,就找不到了

  • 因此还需要在添加一个公有索引库源
  • source 'https://github.com/CocoaPods/Specs.git'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 表示先去找私有,在找公有
source 'https://git.coding.net/iThinkerYZ520/XMGSpec.git'
source 'https://github.com/CocoaPods/Specs.git'

target '测试私有索引库' do

 pod 'XMGLib'
 pod 'AFNetworking', '~> 3.1.0'

end

组件化升级

  • 以后各个组件要不断更新完善,怎么管理。
    • 只需要把最新的版本代码绑定tag,更新Podspec文件,重新上传到版本索引库就好了
      • pod repo push XMGSpec XMGLib.podspec --allow-warnings
    • 工程文件在使用的时候,使用pod update 就能加载最新版本组件代码.
      • pod update --no-repo-update

组件化资源

  • 组件工程资源放哪?
    • 使用pod lib create创建的组件工程,有个Assets文件夹,把图片放这
    • 然后podspec指定资源文件路径s.resource_bundles
    • 仓库代码重新pod install就好了,会自动生成bundle文件,图片就保存到这。

Snip20170213_2.png

Snip20170213_4.png

  • 因为podspec指定的图片资源就是这个路径,就会自动查找这个路径.
  • 如何使用组件代码的资源?
    • 之前获取图片都是在主bundle中:NSBundle mainBundle,但是组件资源代码,不是在主bundle中,是在自己框架的bundle中
    • 获取自己bundle,[NSBundle bundleForClass:self],self:表示当前类,当前方法获取当前类所在的bundle
      • 因为当前方法在自己框架中,就能获取自己的bundle

      Snip20170213_5.png

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    ```
     NSBundle *selfBundle = [NSBundle bundleForClass:self];

    NSLog(@"%@",selfBundle);

    // 获取bundle还不够,图片在bundle的XMGLib.bundle文件中
    // 注意图片要全名
    NSString *path = [selfBundle pathForResource:@"XMGLib.bundle/图片@2x.png" ofType:nil];

    UIImage *image = [UIImage imageWithContentsOfFile:path];

    ```

框架依赖

  • podspec文件中描述:s.dependency 'AFNetworking'
    • 在使用组件的时候就会自动导入第三方库

如何组件化(划分子组件)

  • 随着组件不断扩大,业务也会越来越多,如果不划分子组件,可能我们的工程有时候并不需要导入那么多的业务,也会一起导入到自己工程,造成自己工程不必要的代码太多,所以在大公司一般都会为自己的工程瘦身,就是减少不必要的代码。
  • 一个好的组件,要划分好子组件,别人在加载你的组件的时候,就可以根据自己的需求,加载对应的组件代码
  • 以SDWebImage为例,内部有四个子组件,有一个组件专门用来加载gif图片.

Snip20170213_7.png

  • SDWebImage的podspec文件,描述了子组件,格式固定
    • 注意:自己子组件如果依赖其他子组件,一定要写依赖子组件,否则子组件不能用,下面就依赖Core子组件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s.subspec 'GIF' do |gif|
    gif.ios.deployment_target = '7.0'
    gif.source_files = 'SDWebImage/FLAnimatedImage/*.{h,m}'
    // 设置依赖,依赖自己组件的子组件Core
    gif.dependency 'SDWebImage/Core'
    gif.dependency 'FLAnimatedImage', '~> 1.0'
    gif.xcconfig = {
      'USER_HEADER_SEARCH_PATHS' => '$(inherited) $(SRCROOT)/FLAnimatedImage/FLAnimatedImage'
    }
  end

如何加载子组件

  • podfile文件描述
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 只会引入GIF组件
pod 'SDWebImage/GIF'
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Cocoapods 创建第三方框架
一、上传项目到github 将框架中的主要文件放入到一个指定文件夹中,比如叫Classes或者Lib都可以 目录结构 打开终端,cd到框架目录 cd /Users/lxf/xxxx/LXFPhotoH
LinXunFeng
2018/06/29
3850
iOS代码组件化(利用CocoaPods创建私有库)
每创建一个组件都会带有一个 xxx.podspec 的索引文件。专门用来存放这些索引文件的库就叫做索引库。我们需要将这些索引文件上传到远程索引库才能保证其他的同事能够拿来用。
developerbfl
2019/04/29
2K0
iOS代码组件化(利用CocoaPods创建私有库)
iOS 组件化开发(四):fastlane实现pod自动化
在第一次组件化的时候,需要执行很多操作,这些操作可以在【iOS 组件化开发(一):远程私有库的基本使用】,这里就不再赘述,在组件化后的重复性操作就是升级,而升级这个过程是一模一样的。那么,我们有什么办法可以很方便的搞定这一过程来节约我们大量的时间呢? 一、升级必备操作 修改完核心代码后,一共还需要做以下几步: 1、修改spec文件(修改s.version,s.description等) 2、pod install (使Example与pod下来的库产生关联) 3、提交本地仓库代码至远程仓库 4
LinXunFeng
2018/06/29
1.5K0
iOS 组件化开发(二):远程私有库的更新与子库
在上一篇【iOS 组件化开发(一):远程私有库的基本使用】中我们已经实战了远程私有库的基本操作,但是组件不可能上传一次就完事了,随着业务的增加,我们的组件可能还需要添加更多的东西,或者修复一些问题,这
LinXunFeng
2018/06/29
1.8K0
iOS开发 -- 组件化 之 Cocoapods私有库详解
随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。
CC老师
2022/01/14
1.7K0
iOS开发 -- 组件化 之 Cocoapods私有库详解
CocoaPods 私有仓库的创建(超详细)前言正文结语
相关文章 《CocoaPods公有仓库的创建》 前言 最近参照了网上一大堆 CocoaPods私有仓库 的教程,按教程操作得到的pod仓库里面是这样的~ 代码和版本描述居然混在了一起,简直太糟糕~
BY
2018/05/11
1.4K0
发布组件到cocoaPods
最终生成一个组件项目,会自动打开项目;在项目的目录下,其中有个Example的目录,打开就可以看到目录结构;
花落花相惜
2021/11/26
7430
iOS_制作 cocopods库
mikimo
2023/12/11
1680
iOS_制作 cocopods库
iOS 组件化开发(一):远程私有库的基本使用
随着项目功能的不断增加,越来越多的开发人员加入,业务主线也随之越来越多,造成耦合越来越严重,编译越来越慢,测试不独立等一系列问题。为了解决此类情况,我们可以考虑到使用组件化开发 概念 组件化就是将一个单一工程的项目, 分解成为各个独立的组件, 然后按照某种方式, 任意组织成一个拥有完整业务逻辑的工程。 优势 独立:独立编写、编译、运行、测试 重用:功能代码的重复使用。比如不同项目使用同一功能模块 高效:任意增删模块,实现高效迭代 组件化还可以配合二进制化, 提高项目编译速度 组件分类 大体
LinXunFeng
2018/06/29
1.8K0
基于CocoaPods的组件化原理及私有库实践
智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1>2的效果。 从一个角度上说,石器时代是基于石器的组件化的时代,因为老张家的石矛(或其它石头利器)借给了老王,一样可以拿去狩猎。要想实现这个目的,一定要保证:
nimomeng
2019/03/04
5.1K0
iOS模块化(2)——CocoaPods的运用
iOS组件化现阶段成为开发者讨论的热点问题,个人觉得这是iOS技术日渐成熟的表现,就跟一个人一样,最初是想着如何吃饱,现在开始琢磨如何变着花样吃好。不太想蹭组件化的热度,暂且不要关心这些字眼的意义,实际上不管是组件化还是模块化我们所要解决的问题是一致的:效率。就跟现今社会一样从农业 —工业—信息实际上就是社会生产效率的提高。所以评判我们开发工作成效第一标准应该是否提高了效率,而不是又加了多少班,代码如何的高深莫测。   组件化/模块化实际上在计算机领域一直在使用,包括我们使用的电脑就是按照CPU、内存、显存、硬盘等等各种模块组织到一起。iOS开发中也是按照MVC,MVVM等等各种各样的把代码分拆组合。关于采用何种代码架构我觉得真心没有必要过于迷信他人,说什么好就赶紧跟随推崇,从来不冷静思考我上文所说的问题:是否真的提高了效率?   模块化我们首要做的就是代码的结构的组织调整,关于如何组织代码结构目前流行的就是按照功能和内容。任何团队也不会自诩说自己的代码组织结构是最好方案,因为我们每个团队不管是外部还是内部环境都是不一样的,就跟市面不存在一模一样的APP一样,只要提高了自己团队开发效率的就是最优的,所以我今天主要跟大家探讨是如何用CocoaPods来组织我们的模块化。
羊羽shine
2019/05/29
1.3K0
代码管理| 创建自己的私有Cocopods库
iOS组件化的实现基本基于cocoapods,如何使用cocoapods创建自己的组件库,是实现组件化的第一要素,下面就创建自己的私有Cocopods库展开实战记录。
進无尽
2018/09/12
1.8K0
代码管理| 创建自己的私有Cocopods库
iOS 组件化相关配置
近期开始使用 CocoaPods 组件化开发项目,本文记录个人在创建组件的相关步骤及一些配置,部分代码以Swift为主
gwk_iOS
2019/07/22
9820
iOS 组件化相关配置
CocoaPods 私有仓库依赖 LiteAVSDK 详解
创建索引库和代码库这部分比较简单,可以参考网上资料,以下是为了演示已经创建好的索引库(码云)和代码库(Github):
腾讯视频云-Zachary
2019/08/18
2.2K1
CocoaPods 私有仓库依赖 LiteAVSDK 详解
iOS之创建CocoaPods公有库教程
在开发过程中,经常会使用到第三框架,我们通过一个pod install命令,很方便的就将第三方框架加到我们自己的项目中。
s_在路上
2018/09/11
9490
iOS之创建CocoaPods公有库教程
iOS组件化(一)—Cocopods创建私有库
AaronSwift是你要创建的组件工程的名称。安装过程中会提示你输入要下载工程的配置(如下:),依次输入:iOS、Swift、Yes、Quick、Yes,其中第二步如果想创建OC库,请输入ObjC。(各版本可能有不同,请根据提示输入)
青芒
2020/03/20
2.4K0
iOS组件化(一)—Cocopods创建私有库
XCode打framework包、cocoapods库制作及Pods库的二进制切换
近来公司的公共库里有点小问题,但是公共库打成了framework,即使手上有源码也很难调试。网上百度了很多方法,有临时方法,也有比较好的方案,写一篇博客记录下来,送给正在调试framework的你,哈哈哈。
老司机Wicky
2018/08/22
2.3K0
XCode打framework包、cocoapods库制作及Pods库的二进制切换
代码管理 | 创建并管理自己的公有Cocopods库
一是直接将这部分代码copy到绘本阅读这个项目中; 二是将语音评测这部分逻辑给抽取出来,然后在分别在两处使用。
進无尽
2018/09/12
9410
代码管理 | 创建并管理自己的公有Cocopods库
【iOS开发】Cocoapods详解-使用及创建私有库
CocoaPods现在是通过target来组织的,如果项目有多个target,可以写多个target为每个target引入不同的第三方库。 写法:
吴老师
2018/09/05
7660
【iOS开发】Cocoapods详解-使用及创建私有库
Cocoa包管理器之CocoaPods详解
CocoaPods在Cocoa开发日常工作中经常用到的包管理器,即依赖管理工具。有的项目也有用Carthage的,Carthage是一个比较新的依赖管理工具,是使用Swift语言开发的。Carthage在上家公司的一个项目中实践过一些,用着也挺方便。本篇博客就先系统的了解一下CocoaPods的使用方式和工作原理, 然后在下篇博客中会系统的了解一下Carthage的使用方式和工作原理,这两个依赖仓库系统梳理完毕后,会做一个比较。
lizelu
2018/08/01
1.5K0
Cocoa包管理器之CocoaPods详解
相关推荐
Cocoapods 创建第三方框架
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验