控制了一門語言的構建系統(build system),就控制了這門語言的命運,以及它的生態和社區。

Objective-C 用很短的時間,取得了非常大的變化。在短短幾年間,這門語言從 NeXT 的“廢墟”中走出,成為頗具影響力的一門語言。開源社區對于 Objective-C 有著巨大的貢獻,其中一個很重要的方面是:開發工具。

例如 CocoaPods,它充分證明了科技和社區結合的威力。兩年間,有超過 2700 個開源的庫或框架被添加進去,你只需要簡單的命令行 - pod install,就可以輕松管理第三方庫。

開源社區對于 iOS 和 Mac OS X 開發的各個方面都有著巨大貢獻,第三方庫管理只是其中一個,其他方面還包括自動配置和分發報告BUG文檔檢索等。

但是本周,我們聚焦于這樣一個工具:它重新定義了構建過程,是新一代開發集成的基礎——xctool。

xctool 是 Fred Potter 的開源項目,來自于他在 Facebook 工作中創建的自動構建系統。xctool 用于替換 Xcode.app 中的 xcodebuild

在 Xcode 中點擊“Build & Run”,所有的 project、build target 和 scheme settings 都被傳到 xcodebuild,xcodebuild 調用構建的命令行,然后執行 .ipa 文件運行在真機或模擬器上。

這個過程我們只能祈禱它順利了,因為 Xcode 將自己的構建系統封閉起來,我們從外部很難訪問和控制。當我們試圖通過 Terminal.app 和 xcodebuild 交互的時候,會發現真的很難用。

與其使用上個時代的工具,狂打斷點去遍歷所有錯誤,不如讓 xctool 來告訴你什么是現代的解決方案。

美學和風格

xctool 給人的第一印象是它那漂亮、彩色的輸出樣式。

我們自己作為蘋果硬件和軟件的用戶,對設計絕對不會輕視。xctool 也是。 它把構建過程的每一步都組織的很整潔,通過 ANSI 標準色 和 Unicode 符號輸出易懂、易讀的報告。

但是 xctool 的美麗不僅是外在,build 的過程中可以生成用其他工具可讀的報告:

  xctool -reporter plain:output.txt build

報告類型:

  • pretty:(默認)輸出樣式使用 ANSI 標準色和 Unicode 符號
  • plain:類似 pretty,但沒有 ANSI 標準色和 Unicode 符號
  • phabricator:將構建/測試的結果輸出為 JSON 數組,可導入到 Phabricator 這個 code-review 工具
  • junit:生成兼容 JUnit/xUnit 的 XML 格式的測試結果
  • json-stream:輸出構建/測試的事件流 ( JSON 字典格式),一行一個(如圖)
  • json-compilation-database:輸出 JSON Compilation Database,可用于基于 Clang Tooling 的工具,如 OCLint

集成構建系統

相對于 xcodebuild,xctool 另一個重大改進是可以和 Xcode.app 一樣運行測試(xcodebuild 并不能分辨哪些 target 是 test target,從而單獨運行它們)。

單單這個原因,對于 Objective-C 社區的持續集成測試這個領域,xctool 就有非常大的意義。

Travis CI

Travis CI 為開源項目提供免費的持續集成服務(商業項目收費),支持 Objective-C。它可以在你每次提交到 GitHub 時自動運行你的測試代碼,如果最新的提交導致構建失敗它會通知你。

在你的 Objective-C 項目中添加 Travis CI,你需要創建賬號綁定 GitHub,然后在你的 repo 中添加 .travis.yml 文件:

.travis.yml

language: objective-c before_install:     - brew update     - brew install xctool script: xctool -workspace MyApp.xcworkspace -scheme MyApp test

OCLint

OCLint 是一個靜態代碼分析器,可以檢測 Objective-C 代碼(同時支持 C 和 C++),發現常見的問題:例如 if/else/try/catch/finally 聲明出錯、未被使用的本地實例和參數、過度復雜(有效代碼行數 和 循環復雜度太高)、冗余代碼、代碼異味、以及其他不好的代碼。

還記得 xctool 的 json-compilation-database 格式吧,這種格式可以被 OCLint 直接讀取,進而進行神奇的靜態分析。

在我寫這篇文章的時候,離構建系統集成被廣泛接受還有很長的路,但我的希望是,既然已經開始, 大家就應該齊心協力,讓這個有前途的工具變得更加的強大。

這就像一座城市,隨著人口的增長,基礎設施就需要改變。通過各種各樣的方式,通過本地政府、新興組織,或者其他。總之,環境需要改變,以適應人口的增長。

Objective-C 已經并且還將隨著 iOS 設備的流行而快速進化。為更多新進開發者提供必要的基礎設施是社區的責任,當然這離不開與蘋果的協作(有時是反對或抗議)。我們在這方面做得如何,決定了我們是否真正理解并傳達了作為專業開發者應當扮演的角色,以及應當的承擔責任。

我們是該成為平庸的業余者,還是該成為改善技術的關鍵角色?

xctool,和社區的其他工具一樣,為這門語言的未來和生態,提供了希望和靈感。讓我們繼續創造這樣強大的工具,創造我們為之自豪的開發體驗。

注:本文譯自 NSHipster