更多移動技術(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ù)薛窥。
所以當一臺全新的 Mac 電腦希望運行工程時, 只需要 3 步:
- 安裝 Venom For Mac 客戶端眼姐。
- 使用 Venom 打開工程點擊 Make 按鈕诅迷。
- 構(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 個部分:
- Venom App
- Venom 內(nèi)核
- Venom Server
下面會著重介紹客戶端和內(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)用。
如上圖年碘,使用 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 文件方式管理在主工程倉庫中,通過目錄對組件進行層級劃分管理诫给。
原來的 Podfile 文件通過嵌入 Venom 進行構(gòu)建職責的接管香拉。
使用 Venom 后 pod install 的實際過程就如下圖:
整體上來看, 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)境是我們的主要目標哗总。
<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))倍试。
這樣很好的控制了執(zhí)行命令的環(huán)境讯屈,特別是對新入職的員工是十分友好的。
核心功能
開發(fā)組件關(guān)聯(lián)
正常情況下 clone 下來的主工程(殼工程)內(nèi)是沒有代碼的县习,只有空的工程文件和組件描述文件涮母。Venom 工具劃分了 2 個區(qū)域谆趾,普通組件和定制組件。
因為每個開發(fā)者維護的組件其實是有限的幾個叛本,一般都會將源碼放在固定目錄沪蓬,所以通過設(shè)置客戶端的自動掃描路徑。在 Venom 界面上来候,如果在掃碼路徑下發(fā)現(xiàn)了相關(guān)組件跷叉,則可以一鍵關(guān)聯(lián)本地目錄組件,這樣組件會切換到定制組件的模式進行開發(fā)营搅。
特定版本關(guān)聯(lián)
在開發(fā)過程中云挟,有時需要對某一個依賴庫的特定版本進行調(diào)試或連調(diào)。所以也支持通過 tag转质,commit园欣,branch 等方式,進行特定源碼的切換和關(guān)聯(lián)休蟹。
源碼與二進制切換
某些特殊場景下沸枯,可能希望工程以所有組件都是源代碼方式構(gòu)建,排查問題赂弓。那么也可以通過 2 種不同的構(gòu)建模式一鍵切換绑榴。(當然全源碼構(gòu)建一次需要十足的耐心)
二進制模式下搜索與調(diào)試
二進制化后,大部分情況下都工作在二進制模式下拣展,但有時在進行源碼搜索時彭沼,希望可以全局搜索。所以在構(gòu)建過程中备埃,會把當前版本的源碼目錄也引用到工程目錄下姓惑。
所以在工程進行檢索代碼時,是完全沒問題的按脚。有了源碼于毙,在云端進行二進制打包時,通過 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é)束后會通過對組件層級的檢查溶褪,進行組件依賴層級的判斷币旧。
總結(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 組件化拆分工作