iOS项目组件化

简介: 随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。

前言

随着公司业务的不断发展,团队不断壮大的同时,项目也随之臃肿起来,如何保障团队协作的高效,自然的想到了组件化这个话题。下面总结下本人的梳理和思考。

组件化

  • 为什么我们需要组件化 项目模块间的解耦、模块实现可重用、提升团队成员之间团队之间的协作开发效率、更方便单元测试。
  • 并不是所有的项目都适合组件化 如果你的项目较小,模块之间交互简单,耦合很少;模块没有被外部模块引用,只是一个单独的小模块;模块不需要重用,代码也很少被修改;团队规模很小。那么,你对项目就没有必要做组件化。

如果你的项目有以下三个特征以上,就要考虑下进行组件化了:

  1. 模块逻辑复杂,多个模块之间频繁互相引用
  2. 项目规模逐渐变大修改代码变的越来越困难(这里可以理解为:修改一处代码,需要同时修改其他多个地方);
  3. 团队人数变多,提交的代码经常和其他成员冲突
  4. 项目编译耗时较长
  5. 模块的单元测试经常由于其他模块的修改失败
  • 组件化的8条指标

一个项目经过组件化后如何来评判项目组件化是否彻底或者说是否优秀,可以通过以下几个方面:

  1. 模块之间没有耦合,模块内部的修改不影响其他模块;
  2. 模块可以单独编译
  3. 模块间数据传递明确
  4. 模块可以随时被另一个提供了相同功能的模块替换
  5. 模块对外接口清晰且易维护;
  6. 模块接口改变时,此模块的外部代码能够被高效重构
  7. 尽量用最少的修改和代码,让现有的项目实现模块化;
  8. 支持OC和Swift,以及混编。

前4条主要用于衡量一个模块是否真正解耦后4条主要用于衡量在项目实践中的易用程度

组件化分层

一般一个项目主要分为三层:业务层、通用层、基础层

image-20221010183722274.png

组件化封层之后,需要遵循一下原则:

  1. 只能 上层对下层 依赖, 不能 下层对上层 依赖(下层是对上层的抽象);
  2. 项目公共代码资源下沉;
  3. 横向的依赖尽量少有,最好下称到通用模块或者基础模块。

cocoapods组件化

1.创建远程私仓

  • 从git等代码托管平台或者公司的git仓库创建远程代码仓库
  • 本地仓库和远程仓库关联,并作为组件化工程目录。
    建议使用公司的git仓库,可以公开给需要的人员使用,也避免代码泄露问题。
    具体操作参考git的使用

2.创建组件模块工程

打开终端,cd到工程目录下执行命令:pod lib creat 组件名

如我的组件名称为:component-test, 命令:pod lib create component-test

image-20221010195132961.png

创建完成工程的目录如下:

image-20221010203703371.png

编译成功之后,就可以把自己整理的组件化相关的代码拖入到对应的目录Classes下

路径如下:

image-20221010204241595.png

测试组件化代码如下

IWComponent.h文件如下#ifndef IWComponent_h#define IWComponent_h#import "IWNStringRegex.h"#endif /* IWComponent_h */IWNStringRegex.h文件如下#import NS_ASSUME_NONNULL_BEGIN@interfaceIWNStringRegex : NSObject+ (BOOL)isValidEmail:(NSString*)email;
@endNS_ASSUME_NONNULL_ENDIWNStringRegex.m文件如下#import "IWNStringRegex.h"@implementationIWNStringRegex+ (BOOL)isValidEmail:(NSString*)email{
NSString*emailRegex=@"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate*emailTest= [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTestevaluateWithObject:email];
}
@end

3.使用示例应用程序测试组件功能

  • Classes 中的文件修改后,打开终端cd到Example下进行 pod install (刚才添加到 Classes 中的文件夹 pod 进来)

image-20221010201904673.png

  • 引入头文件,使用相应的功能
#import "IWViewController.h"#import "IWComponent.h"@interfaceIWViewController ()
@end@implementationIWViewController- (void)viewDidLoad{
    [superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.NSString*email=@"fan@iw.com";
BOOLisEmail= [IWNStringRegexisValidEmail:email];
NSLog(@"是否是邮箱:%d", isEmail);
}
- (void)didReceiveMemoryWarning{
    [superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.}
  • 测试结果:
2022-10-1020:50:29.628168+0800component-test_Example[1448:25782] 是否是邮箱:1

4.修改 podspec 文件

  • 编译示例应用工程,测试组件通过,开始修改 podspec 文件。

一般修改一下几个内容:

  1. 修改版本号
  2. 修改项目的简单概述和详细概述
  3. 修改 homepage 和 source 地址
  4. 添加依赖库

podspec常用字段含义和修改如下

## Be sure to run `pod lib lint component-test.podspec' to ensure this is a# valid spec before submitting.## Any lines starting with a # are optional, but their use is encouraged# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html#Pod::Spec.newdo |s|
s.name='component-test's.version='0.1.0's.summary='组件的简介'# This description is used to generate tags and improve search results.#   * Think: What does it do? Why did you write it? What is the focus?#   * Try to keep it short, snappy and to the point.#   * Write the description between the DESC delimiters below.#   * Finally, don't worry about the indent, CocoaPods strips it!s.description=<<-DESC  组件的详细描述                       DESC# s.homepage 作者主页地址  s.homepage         = 'https://gitee.com/taijuios'  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'  #license 开源协议  s.license          = { :type => 'MIT', :file => 'LICENSE' }  # author 作者信息  s.author           = { 'wangtaiju' => 'wang.taiju@iwhalecloud.com' }  # source 组件地址,需要组件的git远程仓库地址一致  s.source           = { :git => 'git@gitee.com:taijuios/component-test.git', :tag => s.version.to_s }  # s.social_media_url = 'https://twitter.com/'  # ios.deployment_target 平台和运行最低系统  s.ios.deployment_target = '10.0'  # source_files 组件源代码路径  s.source_files = 'component-test/Classes/**/*'  # resource_bundles 组件所需资源路径,如图片  # s.resource_bundles = {  #   'component-test' => ['component-test/Assets/*.png']  # }  # public_header_files 对外公开的头文件   s.public_header_files = 'Pod/Classes/IWComponent.h'  # s.frameworks = 'UIKit', 'MapKit'  # dependency 依赖的第三方库  # s.dependency 'AFNetworking', '~> 2.3'end

具体语法参考pod官方:https://guides.cocoapods.org/syntax/podspec.html

5.验证podspec文件

编译通过后,终端cd到组件应用根目录, 提交代码到远程仓库,并打tag

git add .
git commit -m"description"git push origin master
git tag 版本号 (注:这里的版本号必须和 podspec 里写的版本号一致)
git push --tags

执行一下命令:

pod spec lint --verbose --allow-warnings --use-libraries

备注:如果远程仓库和podspec文件中的source地址不一致会报错,远程仓库先打tag,tag需要和podspec文件version一致,否则也会报错不通过。

编译常用的一些命令如下:可以根据需求来选择

--use-libraries 开启库编译

--allow-warnings 允许告警

--sources=3rdlib 第三方依赖

--skip-import-validation 跳过验证

--skip-tests 跳过测试

--verbose 输出日志,

终端显示:component-test.podspec passed validation. 表示成功。

6.提交podspec文件索引

  • 添加pod repo
    pod repo add 'repo名称' 远程仓库地址
pod repo add gitee git@gitee.com:taijuios/component-test.git
  • 验证并提交podspec到远程仓库
pod repo push gitee component-test.podspec --verbose --allow-warnings --use-libraries
  • 备注:pod repo 都远程仓库和podspec文件source需要一致。
    完成后可以在本地cocoapods中看到版本索引了
    image-20221011114036776.png

7.测试

  • 新建一个pod管理应用工程
  • Podfile指定组件源和tag
pod'component-test', :git=>'git@gitee.com:taijuios/component-test.git', :tag=>'0.1.0'
  • pod install,并正常使用则成功。


相关文章
|
2月前
|
iOS开发
iOS App Store 上传项目报错 缺少隐私政策网址 (URL) 解决方法
iOS App Store 上传项目报错 缺少隐私政策网址 (URL) 解决方法
iOS App Store 上传项目报错 缺少隐私政策网址 (URL) 解决方法
|
8月前
|
缓存 移动开发 前端开发
iOS项目组件化历程
随着业务的发展,App中的页面,网络请求,通用弹层UI,通用TableCell数量就会剧增,需求的开发人员数量也会逐渐增多。 如果所有业务都在同一个App中,并且同时开发人数较少时,抛开代码健壮性不谈,实际的开发体验可能并没有那么糟糕,毕竟作为一个开发,什么地方用什么控件,就跟在HashMap中通过Key获取Value那么简单。 那么当业务成长到需要分化到多个App的时候,组件化的重要性开始体现了。
51 0
|
8月前
|
iOS开发 Perl
将Flutter引入到现有项目中(iOS+Flutter)
将Flutter引入到现有项目中(iOS+Flutter)
|
9月前
|
JavaScript iOS开发
iOS上架之HBuider打包简单项目及注意事项
iOS上架之HBuider打包简单项目及注意事项
|
10月前
|
开发工具 iOS开发
iOS 项目无法在模拟器运行解决办法
iOS 项目无法在模拟器运行解决办法
388 0
|
10月前
|
JavaScript iOS开发
iOS上架之hubuilder打包Vue项目
1.官网下载最新的HBuilderx。 2.准备好一个包含manifest.json的Vue项目,打开进行详细设置,设置完成后,点击保存。 3.首先去App Uploader找到开发证书(开发类型是带development的),点击证书P12下载到桌面。 4.然后根据里面的Bundle ID新建一个描述文件,把描述文件也下载到桌面。 5.菜单项点击‘发行->云打包-打原生安装包’,出现如下图所示弹框,取消广告勾选项,点击打包,把前面下载好的证书,描述文件上传到原生打包列表,提交打包,等待打包完成。(仅以iOS为例) 6.打包完成后,点击“OK”保存安装包到目标文件,发送到手机端安装即可运行。
|
存储 编解码 编译器
iOS项目Project 和 Targets配置详解
最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理。
658 0
|
Web App开发 存储 网络协议
ios 组件化之Cocoapods私有库详解以及问题解决方案
ios 组件化之Cocoapods私有库详解以及问题解决方案
ios 组件化之Cocoapods私有库详解以及问题解决方案
|
JavaScript iOS开发
ios上架之​HBuider打包简单项目及注意事项
ios上架之​HBuider打包简单项目及注意事项
65 0
ios上架之​HBuider打包简单项目及注意事项
|
iOS开发 Perl
iOS开发 -多Target项目如何优雅的使用pods
iOS开发 -多Target项目如何优雅的使用pods
365 0