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

更多移動技術(shù)文章請關注本文集:知乎移動平臺專欄

前言

知乎 iOS 客戶端從一開始圍繞問答社區(qū)到目前涵蓋 Feed,會員,商業(yè),文章,想法等多個業(yè)務線的綜合內(nèi)容生產(chǎn)與消費平臺。項目的復雜程度已經(jīng)在超級 App 的范疇。單周發(fā)布與業(yè)務并行開發(fā)也逐漸變成主流。同時在知乎 iOS 平臺,技術(shù)選型一直也都比較開(sui)放(yi)。較早了引入了 Swift 進行業(yè)務開發(fā),列表引入了需要 OC++ 的 ComponentKit 作為核心引擎。所以在這種多業(yè)務方團隊,技術(shù)形態(tài)復雜,組件倉庫數(shù)量多等場景下,也同樣遇到了各種超級 App 團隊都面臨的一些問題。

問題如下:

  • 如何統(tǒng)一開發(fā)環(huán)境
  • 提高編譯速度
  • 提高打包速度
  • 二進制組件調(diào)試
  • 多組件聯(lián)合調(diào)試
  • 多組件聯(lián)合打包
  • 約束組件依賴關系等

當然在思考解決上面這些問題前,知乎 iOS 項目也同樣經(jīng)歷過組件化的工作。與眾多組件化拆分方案殊途同歸,進行了業(yè)務劃分,主倉庫代碼清空,業(yè)務線及 SDK 進行獨立倉庫管理。引入基于路由,基于協(xié)議聲明的組件間通信等機制等,這里就不多贅述了。

簡介

核心介紹的項目名稱為 Venom,靈感來源于電影《毒液》。Venom 的用戶端是一款為開發(fā)人員打造 Mac App,應用內(nèi)置了工程構(gòu)建需要的全套 Ruby Gem 和 Cocoapods 等其相關構(gòu)建環(huán)境。核心目標是解決工程構(gòu)建,二進制構(gòu)建,組件管理,調(diào)試工具等一系列開發(fā)過程中的繁瑣耗時任務。

image

所以當一臺全新的 Mac 電腦希望運行工程時, 只需要 3 步:

  1. 安裝 Venom For Mac 客戶端。
  2. 使用 Venom 打開工程點擊 Make 按鈕。
  3. 構(gòu)建完成點擊 XCode 按鈕打開工程。(當然默認己裝 XCode )

從此告別 ruby,cocoapods 版本不對,gem 問題,bundle 問題以及權(quán)限問題等困擾。因為構(gòu)建環(huán)境內(nèi)置,使得構(gòu)建環(huán)境與工程師本地環(huán)境隔離,極大的降低了工程 setup 的成本。

完整的 Venom 包含了 3 個部分:

  1. Venom App
  2. Venom 內(nèi)核
  3. Venom Server
image

下面會著重介紹客戶端和內(nèi)核相關的技術(shù)方案,數(shù)據(jù)服務目前僅為組件的附加信息提供 API 支持。

Venom 內(nèi)核介紹

在引入 Venom 前,一直使用 Cocoapods 的 Podfile 進行組件的引用。但如果希望對 pod 命令的 DSL 進行擴展,發(fā)現(xiàn)是不夠方便的。索性在 Cocoapods 上層建立自己的組件描述文件,每一個描述文件最終都會被轉(zhuǎn)化為一次 podfile 的 pod 調(diào)用。

image

如上圖,使用 Venom 方式集成的項目,由在 VenomFiles 目錄內(nèi)的組建描述文件組成。

組件描述文件

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 的原有功能基礎上,擴展其他功能(膠水代碼創(chuàng)建,二進制化與源碼切換等)。

組件調(diào)試

同時在與 VenomFile 同級別還設計了一個 Customization.yml 的文件。當開發(fā)過程中,需要對某個組件進行源碼二進制的切換,或者源碼路徑的切換,版本引用的切換等,不會直接改動 VenomFile,會改動 Customization.yml 來進行。在構(gòu)建過程中的優(yōu)先,Customization.yml > Venomfile 。為了每個工程師的改動不會互相影響,Customization.yml 是非 git 托管的。而 VenomFiles 內(nèi)的文件只有更新版本號或其他配置改動,才會更新。

構(gòu)建過程

所有組件都通過一個個 Venomfile 文件方式管理在主工程倉庫中,通過目錄對組件進行層級劃分管理。

image

原來的 Podfile 文件通過嵌入 Venom 進行構(gòu)建職責的接管。

image

使用 Venom 后 pod install 的實際過程就如下圖:

image

整體上來看, Venom 內(nèi)核提供了一套擴展 pod 屬性的描述文件,開發(fā)階段通過 customization.yml 進行可配置的構(gòu)建。構(gòu)建過程中,依賴 Venomfile 文件的唯一標識進行二進制庫和源碼的關聯(lián)。通過對 Cocoapods 構(gòu)建過程的 hook 實現(xiàn)二進制與源碼的引用切換。二進制化方案可參考 :

Xinyu Zhao:知乎 iOS 基于 CocoaPods 實現(xiàn)的二進制化方案?

命令接口

Venom 內(nèi)核除了主要的構(gòu)建職責,還提供了一系列的 ipc 命令。通過這些 ipc 命令,上層的 Venom 客戶端就可以更容易的操作每個組件,進行定制化的開發(fā)組織。來構(gòu)建工程。

例如:

復制代碼

// 修改組件二進制使用方式,使用二進制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 參數(shù)會給整個文件置成空venom ipc customization \    --path /xxx \    --reset \    --name ZHModuleABC

Venom App 介紹

通過對 Venom 內(nèi)核的簡單介紹,其實可以認為,只通過命令行版的工具,就可以達到用到的大部分功能。但因為實際開發(fā)情況一般不會一個人一次只處理一個模塊,所以希望以一種所見即所得方式來讓業(yè)務工程師不用關心下層的邏輯,學習命令??梢钥焖俳⑵痖_發(fā)環(huán)境是我們的主要目標。

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 內(nèi)置了全套的 guby gem 環(huán)境來運行命令。通過 CLITask 來訪問 Venom-core 以及 git 等其他命令(venom 內(nèi)核一樣內(nèi)置在 Venom App 內(nèi))。

image

這樣很好的控制了執(zhí)行命令的環(huán)境,特別是對新入職的員工是十分友好的。

核心功能

開發(fā)組件關聯(lián)

正常情況下 clone 下來的主工程(殼工程)內(nèi)是沒有代碼的,只有空的工程文件和組件描述文件。Venom 工具劃分了 2 個區(qū)域,普通組件和定制組件。

image

因為每個開發(fā)者維護的組件其實是有限的幾個,一般都會將源碼放在固定目錄,所以通過設置客戶端的自動掃描路徑。在 Venom 界面上,如果在掃碼路徑下發(fā)現(xiàn)了相關組件,則可以一鍵關聯(lián)本地目錄組件,這樣組件會切換到定制組件的模式進行開發(fā)。

特定版本關聯(lián)

image

在開發(fā)過程中,有時需要對某一個依賴庫的特定版本進行調(diào)試或連調(diào)。所以也支持通過 tag,commit,branch 等方式,進行特定源碼的切換和關聯(lián)。

源碼與二進制切換

image

某些特殊場景下,可能希望工程以所有組件都是源代碼方式構(gòu)建,排查問題。那么也可以通過 2 種不同的構(gòu)建模式一鍵切換。(當然全源碼構(gòu)建一次需要十足的耐心)

二進制模式下搜索與調(diào)試

二進制化后,大部分情況下都工作在二進制模式下,但有時在進行源碼搜索時,希望可以全局搜索。所以在構(gòu)建過程中,會把當前版本的源碼目錄也引用到工程目錄下。

image

所以在工程進行檢索代碼時,是完全沒問題的。有了源碼,在云端進行二進制打包時,通過 fdebug-prefix-map ( Clang command line argument reference )這個參數(shù)重新在二進制文件中改寫 Debug 模式的源代碼路徑。這樣即使在二進制模式下,也可以直接關聯(lián)源碼進行斷點調(diào)試。

組件依賴關系分析

當組件很多后,就會出現(xiàn)一些工程師對組件所處層級不夠了解,導致出現(xiàn)依賴混亂的問題。所以在構(gòu)建結(jié)束后會通過對組件層級的檢查,進行組件依賴層級的判斷。

image

總結(jié)

在推進所有工程師使用 Venom 客戶端后,相當于在開發(fā)環(huán)節(jié)有了一個強有力的抓手。由于 App 的自動更新功能,可以在平臺下提供給開發(fā)者更多的工具,而開發(fā)者只需要更新客戶端使用。通過工具化客戶端的開發(fā),我們重構(gòu)了原有散落在各處的腳步,工具集中整合在一起。使得開發(fā)工具維護更統(tǒng)一,更新也更及時,開發(fā)人員上手成本也更低。

Venom 核心承擔的是開發(fā)環(huán)境管理,工程組織與構(gòu)建管理,提高工程效率工作。但上線后,我們還陸續(xù)在此基礎上提供了一些其他功能。

  • 多倉庫 MR 自動填充提交
  • 本地非獨立業(yè)務倉庫單元測試
  • 個人開發(fā)者賬號真機調(diào)試
  • 無用圖片掃描工具
  • 輕量的 app 網(wǎng)絡和日志查看等

另外,知乎移動平臺團隊也在招人中,歡迎各位 iOS 小伙伴的加入,和我們一起做一些酷事情!具體招聘信息在這里 https://app.mokahr.com/apply/zhihu/3819#/job/f15ff88f-84a9-40f1-b33d-e568b0b30812?_k=m4kqqs

關于作者

付三歲,2016 年加入知乎,現(xiàn)為知乎 iOS 基礎架構(gòu)團隊負責人,有著豐富的 iOS 工程化,組件化經(jīng)驗,設計并主導了知乎的 iOS 組件化拆分工作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容