知乎 iOS 客户端工程化工具 Venom

前言

知乎 iOS 客户端从一开始围绕问答社区到目前涵盖 Feed,会员,商业,文章,想法等多个业务线的综合内容生产与消费平台。项目的复杂程度已经在超级 App 的范畴。单周发布与业务并行开发也逐渐变成主流。同时在知乎 iOS 平台,技术选型一直也都比较开(sui)放(yi)。较早了引入了 Swift 进行业务开发,列表引入了须要 OC++ 的 ComponentKit 做为核心引擎。因此在这种多业务方团队,技术形态复杂,组件仓库数量多等场景下,也一样遇到了各类超级 App 团队都面临的一些问题。html

问题以下:git

  • 如何统一开发环境
  • 提升编译速度
  • 提升打包速度
  • 二进制组件调试
  • 多组件联合调试
  • 多组件联合打包
  • 约束组件依赖关系等

固然在思考解决上面这些问题前,知乎 iOS 项目也一样经历过组件化的工做。与众多组件化拆分方案异曲同工,进行了业务划分,主仓库代码清空,业务线及 SDK 进行独立仓库管理。引入基于路由,基于协议声明的组件间通讯等机制等,这里就很少赘述了。web

简介

核心介绍的项目名称为 Venom,灵感来源于电影《毒液》。Venom 的用户端是一款为开发人员打造 Mac App,应用内置了工程构建须要的全套 Ruby Gem 和 Cocoapods 等其相关构建环境。核心目标是解决工程构建,二进制构建,组件管理,调试工具等一系列开发过程当中的繁琐耗时任务。面试

image

因此当一台全新的 Mac 电脑但愿运行工程时, 只须要 3 步:算法

  1. 安装 Venom For Mac 客户端。
  2. 使用 Venom 打开工程点击 Make 按钮。
  3. 构建完成点击 XCode 按钮打开工程。(固然默认己装 XCode )

今后告别 ruby,cocoapods 版本不对,gem 问题,bundle 问题以及权限问题等困扰。由于构建环境内置,使得构建环境与工程师本地环境隔离,极大的下降了工程 setup 的成本。swift

完整的 Venom 包含了 3 个部分:ruby

  1. Venom App
  2. Venom 内核
  3. Venom Server
image

下面会着重介绍客户端和内核相关的技术方案,数据服务目前仅为组件的附加信息提供 API 支持。微信

Venom 内核介绍

在引入 Venom 前,一直使用 Cocoapods 的 Podfile 进行组件的引用。但若是但愿对 pod 命令的 DSL 进行扩展,发现是不够方便的。索性在 Cocoapods 上层创建本身的组件描述文件,每个描述文件最终都会被转化为一次 podfile 的 pod 调用。网络

image

如上图,使用 Venom 方式集成的项目,由在 VenomFiles 目录内的组建描述文件组成。数据结构

组件描述文件

VenomFile.new do |v|  v.name = 'XXModuleA'  v.git = 'git@git.abc.abc.com:Team-iOS-Module/XXModule.git'  v.tag = '1.0.0'  v.binary = false  v.use_module_map = true  v.XX...end复制代码

组件描述文件能够理解是 pod 命令的一个超集,在包含了 pod 的原有功能基础上,扩展其余功能(胶水代码建立,二进制化与源码切换等)。

组件调试

同时在与 VenomFile 同级别还设计了一个 Customization.yml 的文件。当开发过程当中,须要对某个组件进行源码二进制的切换,或者源码路径的切换,版本引用的切换等,不会直接改动 VenomFile,会改动 Customization.yml 来进行。在构建过程当中的优先,Customization.yml > Venomfile 。为了每一个工程师的改动不会互相影响,Customization.yml 是非 git 托管的。而 VenomFiles 内的文件只有更新版本号或其余配置改动,才会更新。

构建过程

全部组件都经过一个个 Venomfile 文件方式管理在主工程仓库中,经过目录对组件进行层级划分管理。

image

原来的 Podfile 文件经过嵌入 Venom 进行构建职责的接管。

image

使用 Venom 后 pod install 的实际过程就以下图:

image

总体上来看, Venom 内核提供了一套扩展 pod 属性的描述文件,开发阶段经过 customization.yml 进行可配置的构建。构建过程当中,依赖 Venomfile 文件的惟一标识进行二进制库和源码的关联。经过对 Cocoapods 构建过程的 hook 实现二进制与源码的引用切换。二进制化方案可参考 :

Xinyu Zhao:知乎 iOS 基于 CocoaPods 实现的二进制化方案​

命令接口

Venom 内核除了主要的构建职责,还提供了一系列的 ipc 命令。经过这些 ipc 命令,上层的 Venom 客户端就能够更容易的操做每一个组件,进行定制化的开发组织。来构建工程。

例如:

复制代码

// 修改组件二进制使用方式,使用二进制venom ipc customization \ --path /Users/abc/Developer/zhihu/abc/def \ --edit \ --name ZHModuleABC \ --binary// 修改组件二进制使用方式,使用源码venom ipc customization \ --path /Users/abc/Developer/zhihu/abc/def \ --edit \ --name ZHModuleABC \ --source// 修改 yml 文件中指定组件的路径venom ipc customization \ --path /Users/abc/Developer/zhihu/abc/def \ --edit \ --name ZHModuleABC \ --pod_path /path/to/ZHModuleABC// reset 某个组件在 customization 中的 change,不指定 name 参数会给整个文件置成空venom ipc customization \ --path /xxx \ --reset \ --name ZHModuleABC复制代码

Venom App 介绍

经过对 Venom 内核的简单介绍,其实能够认为,只经过命令行版的工具,就能够达到用到的大部分功能。但由于实际开发状况通常不会一我的一次只处理一个模块,因此但愿以一种所见即所得方式来让业务工程师不用关心下层的逻辑,学习命令。能够快速创建起开发环境是咱们的主要目标。

image

<center style="color: rgb(74, 74, 74); font-family: Avenir, Tahoma, Arial, "PingFang SC", "Lantinghei SC", "Microsoft Yahei", "Hiragino Sans GB", "Microsoft Sans Serif", "WenQuanYi Micro Hei", Helvetica, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">客户端主要模块</center>

Venom App 内置了全套的 guby gem 环境来运行命令。经过 CLITask 来访问 Venom-core 以及 git 等其余命令(venom 内核同样内置在 Venom App 内)。

image

这样很好的控制了执行命令的环境,特别是对新入职的员工是十分友好的。

核心功能

开发组件关联

正常状况下 clone 下来的主工程(壳工程)内是没有代码的,只有空的工程文件和组件描述文件。Venom 工具划分了 2 个区域,普通组件和定制组件。

image

由于每一个开发者维护的组件实际上是有限的几个,通常都会将源码放在固定目录,因此经过设置客户端的自动扫描路径。在 Venom 界面上,若是在扫码路径下发现了相关组件,则能够一键关联本地目录组件,这样组件会切换到定制组件的模式进行开发。

特定版本关联

image

在开发过程当中,有时须要对某一个依赖库的特定版本进行调试或连调。因此也支持经过 tag,commit,branch 等方式,进行特定源码的切换和关联。

源码与二进制切换

image

某些特殊场景下,可能但愿工程以全部组件都是源代码方式构建,排查问题。那么也能够经过 2 种不一样的构建模式一键切换。(固然全源码构建一次须要十足的耐心)

二进制模式下搜索与调试

二进制化后,大部分状况下都工做在二进制模式下,但有时在进行源码搜索时,但愿能够全局搜索。因此在构建过程当中,会把当前版本的源码目录也引用到工程目录下。

image

因此在工程进行检索代码时,是彻底没问题的。有了源码,在云端进行二进制打包时,经过 fdebug-prefix-map ( Clang command line argument reference )这个参数从新在二进制文件中改写 Debug 模式的源代码路径。这样即便在二进制模式下,也能够直接关联源码进行断点调试。

组件依赖关系分析

当组件不少后,就会出现一些工程师对组件所处层级不够了解,致使出现依赖混乱的问题。因此在构建结束后会经过对组件层级的检查,进行组件依赖层级的判断。

image

总结

在推动全部工程师使用 Venom 客户端后,至关于在开发环节有了一个强有力的抓手。因为 App 的自动更新功能,能够在平台下提供给开发者更多的工具,而开发者只须要更新客户端使用。经过工具化客户端的开发,咱们重构了原有散落在各处的脚步,工具集中整合在一块儿。使得开发工具维护更统一,更新也更及时,开发人员上手成本也更低。

Venom 核心承担的是开发环境管理,工程组织与构建管理,提升工程效率工做。但上线后,咱们还陆续在此基础上提供了一些其余功能。

  • 多仓库 MR 自动填充提交
  • 本地非独立业务仓库单元测试
  • 我的开发者帐号真机调试
  • 无用图片扫描工具
  • 轻量的 app 网络和日志查看等


做者:老邢Thierry
连接:https://www.jianshu.com/p/b65d7bb7fa32

给你们推荐一个iOS技术交流群,群内提供数据结构与算法、底层进阶、swift、逆向、底层面试题整合文档等免费资料!!!

可加我微信邀请你们进群

此文章来源于第三方转载


相关文章
相关标签/搜索