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

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

前言

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

問題如下:

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

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

簡介

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

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)核相關(guān)的技術(shù)方案持际,數(shù)據(jù)服務(wù)目前僅為組件的附加信息提供 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 的原有功能基礎(chǔ)上埃难,擴展其他功能(膠水代碼創(chuàng)建,二進制化與源碼切換等)涤久。

組件調(diào)試

同時在與 VenomFile 同級別還設(shè)計了一個 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 文件的唯一標識進行二進制庫和源碼的關(guān)聯(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è)務(wù)工程師不用關(guān)心下層的邏輯您朽,學習命令』幌可以快速建立起開發(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ā)組件關(guān)聯(lián)

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

image

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

特定版本關(guān)聯(lián)

image

在開發(fā)過程中云挟,有時需要對某一個依賴庫的特定版本進行調(diào)試或連調(diào)。所以也支持通過 tag转质,commit园欣,branch 等方式,進行特定源碼的切換和關(guān)聯(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 模式的源代碼路徑辅搬。這樣即使在二進制模式下唯沮,也可以直接關(guān)聯(lián)源碼進行斷點調(diào)試。

組件依賴關(guān)系分析

當組件很多后堪遂,就會出現(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ù)在此基礎(chǔ)上提供了一些其他功能。

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

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

關(guān)于作者

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奶镶,一起剝皮案震驚了整個濱河市迟赃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厂镇,老刑警劉巖纤壁,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捺信,居然都是意外死亡酌媒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門迄靠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秒咨,“玉大人,你說我怎么就攤上這事掌挚∮晗” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵疫诽,是天一觀的道長舅世。 經(jīng)常有香客問我旦委,道長,這世上最難降的妖魔是什么雏亚? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任缨硝,我火速辦了婚禮,結(jié)果婚禮上罢低,老公的妹妹穿的比我還像新娘查辩。我一直安慰自己,他們只是感情好网持,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布宜岛。 她就那樣靜靜地躺著,像睡著了一般功舀。 火紅的嫁衣襯著肌膚如雪萍倡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天辟汰,我揣著相機與錄音列敲,去河邊找鬼。 笑死帖汞,一個胖子當著我的面吹牛戴而,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翩蘸,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼所意,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了催首?” 一聲冷哼從身側(cè)響起扶踊,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翅帜,沒想到半個月后姻檀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡涝滴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年绣版,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼疮。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡杂抽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出韩脏,到底是詐尸還是另有隱情缩麸,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布赡矢,位于F島的核電站杭朱,受9級特大地震影響阅仔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弧械,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一八酒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刃唐,春花似錦羞迷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抖甘,卻和暖如春热鞍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背单山。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工碍现, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幅疼,地道東北人米奸。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像爽篷,于是被迫代替她去往敵國和親悴晰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容