1.0 iOS模块化中的问题

前文已经介绍了模块化的流程及一些常见的问题,我们在这里再次总结一下。

在工作中,当我们开始一个新项目的时候,最先考虑的就是模块化工作。

模块化工作的想法是很美好的,可是执行过程中会遇到很多的问题,而这些问题可能会让我们在工作中举步维艰。

  1. 工具使用问题。iOS的模块化一般会使用cocoapods工具,这个工具很强大,内容也很丰富,我们想要完成模块化工作,需要建立私有库,编写podspec文件,处理资源,编写Podfile文件,建立本地依赖等等。让团队成员每个人都精通这个工具是不必要的。因此经常会在使用工具中遇到不易解决的问题,从而浪费大量的时间。

  2. xcode设置问题。xcode设置项多如牛毛,很多内容看起来并不直观,需要我们去查阅官方文档来解决。而且这些设置数量多,使用的频率又少,所以难免会出现这样的情况:每个人都遇到的问题,然后各自去花时间解决,然后过段时间遇到相同的问题常常就忘记了,还要花时间去查阅解决,造成资源的重复浪费。

  3. 模块间依赖的问题,当你依赖的也是私有库的其他模块(下文中称为自有模块)时,开发中可能要同时修改多个模块,这样就会出现在多个工程中切换的问题。

  4. 规范问题,每个人建立模块的方式可能都不同,包括工程结构,工程设置等等。这样一来,不同的模块可能差异特别大,当跨模块开发或者代码交接的时候,可能就会出现难以解决的问题。

  5. 设置的变更修改都是手动修改,有时候难免会因为疏忽,而导致难以发现的错误,当需要处理的模块和依赖较多时,发生错误的概率也会增加。

2.0 编写自动化工具

为了解决这些问题,让团队能够将精力全部集中到业务开发中,特使用bash shell开发一个构建工具,用于自动化处理模块化的过程中遇到的设置及工具使用问题。

工具的地址如下:https://github.com/hardman/AWModularization

使用这个自动化工具你将会获得如下能力:

  1. 一条命令即可创建模块工程,创建.podspec及Podfile文件,自动安装依赖,工程默认使用静态库,支持Swift和OC
  2. 一条命令即可拉取之前开发的模块,并且安装好所有依赖
  3. 一条命令即可自动打tag,自动更新.podspec文件,将工程推送到pod服务器
  4. 自有模块的列表,将会保存在单独git库中,便于有依赖模块时,可动态加载
  5. 自有模块的依赖都通过.podspec文件使用local path的方式安装,这样当被依赖的模块也需要修改时,不需要打开多个工程

因此,使用这个自动化工具,你不需要了解cocoapods工具,也不需要处理任何工程和工具设置,可以将注意力都集中到业务开发中。

【注】工具使用静态库作为模块的输出文件。

3.0 工具的使用

3.1 基本使用步骤

  1. 将工程clone到本地目录
  2. 打开tools/config修改配置文件
    • modulelistgitaddress.txt:新建一个git库,并将地址保存在这个文件中,地址最好是以git@开头。这个git库用于保存所有自有模块名称及地址。
    • podspecsaddr.txt:再新建一个git库,将地址保存在这个文件中,地址最好是git@开头。这个git库就是你的私有库地址。
    • podspecsname.txt:为你的git库取一个名字,保存在这个文件中
    • 上述3个文件都只有一行
    • dependencypodrepos.txt:这个文件保存你的app依赖的其他pod repos,一般情况下保持默认即可,支持多行,每行保存一个地址
    • 由于这些配置几乎不会修改,考虑将这些文件提交到你自己的git库中
  3. 执行 ./create.sh -n=[模块名] -b=[bundle id] -t=[s|f|r] 即可创建工程
    • 脚本执行过程中会要求输入一些工程基本信息及所依赖的模块,请认真输入,不要遗漏
    • 创建的工程会自动打开,并且可以直接执行
    • 创建好的模块文件在:工程根目录/modules
    • 例:./create.sh -n=HelloWorld -b=com.helloworld -t=s
  4. 模块开发完毕,需要将代码提交到develop分支,然后执行./push.sh [模块名] [tag]
    • 执行push.sh时,模块必须在develop分支上
    • 执行成功后,你的模块就已经提交成功,可以通过Podfile文件引用了
    • 例:./push.sh HelloWorld 0.0.1
  5. 使用 ./pull.sh [模块名] 即可下载其他未同步到本地的自有模块
    • 执行成功后,会自动下载所有依赖的模块,并通过local path添加到模块依赖中
    • 例:./pull.sh HelloWorld

3.2 如何提升模块所依赖其他模块的版本号

有的时候,当前模块所依赖的模块版本升级了,需要修改当前模块的依赖文件。
有2种方法:

  1. 直接修改文件

    • 需要修改的文件有2个,一个是文件根目录的dependency.txt文件,文件内记录了当前模块依赖的自有模块
    • dependency.txt文件记录模块版本的格式是:每行一个模块;格式为:模块名@@版本号,版本号支持~>前缀,不可带空格
    • 另一个文件是模块名.podspec文件
    • 按照podspec文件要求的格式去修改版本号
  2. 使用脚本修改
    • 执行命令:./utils.sh [模块名] upgradedependency [依赖的模块名] [版本号]
    • 其中版本号可以为空
    • 例子:./utils.sh LoginModule upgradedependency AFNetworking 3.5.0
    • 例子:./utils.sh LoginModule upgradedependency AFNetworking
  3. 版本号可支持英文字符:a.b.c

3.3 如何在模块工程内使用Swift&OC混编

  1. 在module工程内创建OC的类文件及swift文件,假设OC类名为 TestOC,swift类名为TestSwift
  2. 让OC能够访问Swift类
    • 只需要在TestOC.m中添加import。例:#import "模块名/模块名-Swift.h"
    • 另外需注意的是,TestSwift类必须是public并继承自NSObject。
  3. 让Swift能够访问OC类
    • 在 [模块名].h 这个文件中引入你的头文件。例:#import "TestOC.h"
    • xcode - build phases - [模块名].h 文件必须在public区域

3.4 关于模块资源文件的获取

  1. 由于模块都是静态库,所以最终运行到app中后,每个模块的资源文件(.xcassets, .xib, .png, .jpg, .jpeg, .gif, .txt, .plist, .bundle, .zip, .car)都是放到: "模块名.bundle"文件中的,而这个bundle在main bundle的根目录(这也是要求模块名防止重名的原因之一)
  2. 所以获取图片可以使用 UIImage.init(named: name, in: bundle, compatibleWith: nil) 方法
  3. 获取其他文件也需要指定bundle才可以
  4. 开发过程中,获取任何资源都需要带bundle,不能直接使用类似 UIImage.init(named:String)这种方法,即使是在模块工程内部的代码也不行
  5. 需要注意的是,静态库的单元测试target是无法获取资源的

3.5 注意事项

  1. 模块名要防止重复,不但要防止同一个私有库重复,也要防止与其他pod repo内的模块重复
  2. 依赖库不可产生循环依赖,比如 A依赖B,B依赖C,C依赖A
  3. 每个模块都有一个develop分支,develop分支的代码总是与最新的tag保持一致。执行push命令时,代码总是在develop分支上
  4. 开发期间(集成测试前)总是依赖本地模块,每次总是在集成测试前,才会执行push.sh脚本
  5. 如果当前的开发模块有修改,同时依赖的模块也有修改,则需要先push当前模块所依赖的模块,最后push当前模块。这时候可能需要使用 ./utils.sh [模块名] upgradedependency [依赖的模块名] [版本号] 命令修改模块所依赖的模块的版本号

–完--

  1. iOS应用模块化的思考及落地方案(一)模块的划分及模块化工作流程
  2. iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用

iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用相关推荐

  1. iOS应用模块化的思考及落地方案(一)模块的划分及模块化工作流程

    1.0 什么是模块化 很多关于重构及设计模式的介绍中,经常提到的几个词语是复用及解耦. 模块化之所以被提出,也更多是为了解决这几个问题. 复用可以减少重复造轮子的情况,很容易理解的是,我们经常使用的g ...

  2. 自己动手设计一款iOS自动构建发布工具

    2019独角兽企业重金招聘Python工程师标准>>> 自己动手设计一款iOS自动构建发布工具 一.引言 在iOS开发中,你可能经常会遇到这样的场景: 自己负责的功能模块开发完成后, ...

  3. 重构知识的供给模式 ——《数据平台》从思考到落地

    简介:如何去建立一套 "高度自动化&体系化的知识管理系统,重构知识的供给模式".是不是看不懂?而且有点冲?是不是谜语人附体?别急,本文作者将会做详细的说明. 作者 | 七惜 ...

  4. dubbo k8s 服务发现_将Dubbo微服务迁移到k8s集群环境中前的思考与落地

    将Dubbo微服务迁移到k8s中的思考与落地 说到容器化,不得不提kubernetes这个集群编排系统,它是一个开源系统,用于容器化应用的自动部署.扩缩和管理. Kubernetes 将构成应用的容器 ...

  5. 互联网企业申请95号 正确落地方案可节省50%费用

    当接到95555来电时,你会想到招商银行:当接到95338来电时,你会想到顺丰快递.95客服号码由于资源稀缺.数字简短易记,已成为银行.证券.保险.民航.物流.石油石化.铁路运输等知名企业的专用.95 ...

  6. mysql落地方案_平台落地方案.doc

    平台落地方案 江苏省教育管理信息中心 江苏省电化教育馆 江 苏 省 教 育 信 息 化 公 共 服 务 平 台 推广应用落地方案 <江苏省教育信息化公共服务平台>推广应用落地实施方案(草) ...

  7. 分表需要解决的问题 基于MyBatis 的轻量分表落地方案

    分表:垂直拆分.水平拆分 垂直拆分:根据业务将一个表拆分为多个表. 如:将经常和不常访问的字段拆分至不同的表中.由于与业务关系密切,目前的分库分表产品均使用水平拆分方式. 水平拆分:根据分片算法将一个 ...

  8. 开源助推进NFV发展,红帽为运营商“定制”NFV落地方案

    日前,红帽公司欧洲.中东以及非洲地区的电信行业业务发展总监Nikolai Stankau和红帽公司亚太区电信业务发展总监Adam Nardella在接受采访时表示,目前运营商在引入NFV方面主要存在三 ...

  9. 人工智能技术结合制造业,是学术研究还是落地方案?!

    飞桨中国行-零门槛AI创新应用专场来了 制造业正快速步入智能化升级的新阶段,包括生产流程.业务模式.管理方式在内的每一个环节,都将发生根本改变,越来越多的制造企业正把智能化作为推动业务增长的重要途径. ...

最新文章

  1. 导入eclipse工程到Android Studio中
  2. 数据与分析领域的十大技术趋势
  3. linux下oracle自动创建实例脚本
  4. eclipse 安装svn插件
  5. 点击页面空白处就关闭某个层是怎么做到的
  6. 【数据库复习】第二章关系数据库
  7. [leetcode] 160.相交链表
  8. 关于推荐的一个算法工程师访谈,有一些内容值得看看
  9. 小记 cin/get/getline
  10. 在anaconda python开发套件下进行opencv的安装
  11. prototype.js学习(3)函数绑定
  12. linux虚拟内存和win,linux下的vm(虚拟内存)和windows下的作用是一样的,均是防止真实内存资源不足准备的. linux的vm相关参数...
  13. 基于python-scrapy框架的爬虫系统
  14. Turbo码原理简介
  15. ThinkPHP商城系统与外部系统用户互通,集成UCenter
  16. 计算机病毒属于源程序吗,计算机病毒是否是源程序吗
  17. 新买的移动硬盘不显示盘符?西部数据SSD无痛初始化指南
  18. 第二届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2023)
  19. 一个劣质无线鼠标接收器导致笔记本无线网络连接出现故障
  20. office word安装mathtype报错,找不到mathpage.WLL文件

热门文章

  1. hive函数 get_json_object的使用
  2. BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)
  3. windows常用命令有哪些(整理)
  4. LeetCode 228: Summary Ranges
  5. SQL注入漏洞全接触--入门篇
  6. TCP/IP中 3688端口是什么?
  7. 插入记录时单引号的处理
  8. ASP.NET重用代码技术 - 用户控件技术
  9. 【数据库】MySQL的C语言接口学习
  10. Linux驱动:TI达芬奇系列kernel中cup类型的判断,以cpu_is_ti81xx()为例