知乎 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、逆向、底層面試題整合文檔等免費資料!!!

可加我微信邀請你們進羣

此文章來源於第三方轉載


相關文章
相關標籤/搜索