iOS工程构建工具开发实践

前言

最近几年,关于iOS组件化讨论和分享的越来越多,业内也形成了多套成熟的技术方案,但大家多数讨论在工程的代码层面,例如组件的注册,解耦、消息传递等,却很少有人分享由于组件过多,导致组件管理复杂,构建流程较慢的问题,针对此问题我们自研了58同城iOS工程的组件构建工具,本文会对其做简单介绍,以供大家参考。

背景及目标

58同城随着App的功能越来越复杂,所承载的业务越来越多,iOS研发团队早就从几个人变成了几十人,随之App也采用了组件化设计方案,将自身App拆分成多个模块,目前公司采用的是Cocoapods私有库方案,即根据自身需要拆成数个Pod私有库,编写Podspec文件,最后通过Podfile组装,但由于业务越来越多,导致组件过多,对我们的编译构建造成了不小的麻烦。最开始我们的Podfile大概是这样的

这种Podfile应该也是目前业内比较普遍的写法,简单易懂,各种组件都列表一样展示在眼前,真是让人神清气爽。可是好景不长,由于集成的源码越来越多,导致编译越来越慢,我们为了加快编译时间,对所有的组件进行了预编译,并做成了独立的Pod进行管理,之后我们在构建的时候可以不采用源码来集成,提升了编译速度,然而麻烦也随之而来,组件数量翻倍了,为了方便构建我们将Podfile变成了另一种写法,通过外部命令参数传入需要构建的组件,Podfile大概就变成了这样

上面这一小部分截图足以让人抓狂了,这上面的截图可以看出复杂的Podfile是对开发人员及其不友好的,因为里面夹杂了一些程序逻辑,阅读起来也非常不方便,你以为这就完事了?代码分支切换呢?代码更新呢?SourceTree截图如下,一屏根本放不下

过多的组件也导致了我们管理麻烦,经常要批量切换分支,虽然我们写了一个切换分支的脚本,操作繁琐,犯错率高,并没有图形界面给人以直观的感知。从一个新人角度出发,要想将58的工程跑起来,至少要配置1天,从搭建环境,到下载组件,了解构建流程,中间还可能会出现各种各样的错误,可以说对新人是极大地不友好的,为此我们希望在组件化为我们带来了模块分权,bug减少,加快编译时间等优点的同时,让开发者能更加的专注于代码层面,无需关心组件之间的配置,构建等,大幅提升开发效率,故我们开发了一套工程构建工具。

开发实践

为了简化操作,让一切的操作变的更友好,我们将所有的操作流程进行了UI化,一款方便开发人员使用的辅助构建工具诞生,软件界面如下

首先这是一款Mac应用,为了紧跟潮流,采用了Swift语言进行开发,从界面上可以看出,该软件目前包含了分支切换,代码更新,项目重启,分支清理等功能,下面将逐步介绍软件的实现过程的几个关键点。

1. 如何在Mac App中执行命令

软件的初衷就行想将脚本命令通过UI操作触发,并传入参数,在命令执行过程中能获得输出的文本信息,这样就可以满足大部分的需求场景,调研发现Cocoa框架中原生API就支持这种方式,执行一条命令的代码如下

使用上面的方式有一种弊端,就是当命令执行完成后,才会输出执行过程中日志,而不能实时的获取,而我们的一些命令,例如pod install在执行过成功会产生大量的文本信息,这样就需要将我们的代码稍微进行改造

这样我们就能在回调中实时获取输出的文本信息。

2. 如何正确的执行pod install命令

在使用代码执行pod install命令时,发现有人电脑不支持,返回command not found,或者路径错误等,调查发现是因为他们采取的是RVM管理的Ruby环境,这时pod命令发生了改变,不在/usr/local/bin下,发现网上很久以前的Xcode插件已经有对应的解决方案,关键代码如下

3. 如何批量更新,切换分支

软件的主要功能就是为了解决批量操作Pod的问题,我们很容易想到,将之前命令封装成一个脚本,然后传入参数,进行批量操作,下面以批量更新为例:

首先创建一个.sh文件,并写入

然后在代码中

执行该命令,其中gitStrArr为传入的参数信息

4. 如何进行登录校验

为了以后做角色管理,确认开发人员信息做了简单的登录功能,登录界面如下

GitLab为我们提供了完善的API文档,接入简单,例如登录接口为

登录成功后,建议保存private_token,以后的Gitlab操作均需要此值

5. 如何进行分支清理

在开发过程中,由于需求会拉取过多的需求分支,若不及时清理,就会产生很多的废弃分支,这不仅会增加我们git仓库的体积,同时也会造成分支过多,无法快速定位所需分支,故开发了分支清理的功能,此功能涉及的git命令较多,所以一开始不想用脚本命令去实现,在调研时,发现了关于Git管理的第三方库libgit2,利用该库可以快速的获取分支名,删除分支等.

删除分支只需一行代码

产出与效果

1.完全的UI级操作,开发人员完全不需要了解脚本,上手速度快,操作简单。

2.批量切换分支,代码更新,想搞哪个就哪个,再也不用使用繁琐的命令行了

3.构建简单,无需了解Podfile,不需要在打开终端输入复杂的命令参数,勾勾选选一键搞定

总结与展望

1. 减少终端操作,快速构建集成,学习成本低

更新代码,切换分支等命令已经完全集成到工具中,仅需要通过点击几个按钮就可以完成操作,完成快速集成的目的。

2. 运行效率较低,流程须优化

目前工具中大部分操作还是简单的在App中执行命令行操作,例如分支切换git checkout,代码更新git pull,这些操作通过监听命令行执行时,通过信息返回的关键字来进行处理,效率较低,完全可以通过libgit2来,执行这些操作提高效率,所有与git有关的操作都应以此来执行。

3. 前置环境配置复杂,仍需改进

目前环境配置需要Git,Cocoapods等配置环境,也需要配置ssh等,所需要的环境复杂,工具是依赖于这些环境的,在工具启动时,会检测环境的配置,但前置环境还需开发人员自己配置,在以后的开发中会对此工具进行改造,达到自动化配置前置环境。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180525G1NFLL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券