本頁說明如何使用 Bazel 建構或測試 Xcode 專案。這項服務 說明 Xcode 和 Bazel 之間的差異 ,將 Xcode 專案轉換為 Bazel 專案。另外,這項產品也提供 來修正常見錯誤。
Xcode 和 Bazel 之間的差異
Bazel 需要您明確指定每個建構目標及其 依附元件,再加上透過建構規則所對應的建構設定。
Bazel 需要專案所在的所有檔案 工作區目錄中,或是指定為
WORKSPACE
中的匯入內容 檔案。使用 Bazel 建構 Xcode 專案時,
BUILD
檔案會成為 可靠結果。如果您是在 Xcode 處理專案,則必須產生 新版與BUILD
檔案相符的 Xcode 專案 每當您更新BUILD
檔案時,Tulsi 就會是「Tulsi」。如果 您並未使用 Xcode,則bazel build
和bazel test
指令會提供 建構及測試功能,但有特定限制 指南。由於建構設定結構定義 (例如目錄版面配置) 的差異 或是建構標的,Xcode 可能無法完全瞭解的 因此某些 Xcode 功能可能無法運作名稱:
視您在圖爾西為轉換選擇的目標而定,Xcode 可能會 無法正確為專案來源建立索引這會影響程式碼 但由於 Xcode 不會顯示 專案的原始碼中
靜態分析、位址清理程式和執行緒清理程式可能無法 因為 Bazel 不會產生 Xcode 預期會輸出的 這些特徵的相對重要性
如果您透過 Tulsi 產生 Xcode 專案,並透過該專案執行 進行測試時,Xcode 會執行測試,而不是 Bazel。如要使用 Bazel 執行測試,請手動執行
bazel test
指令。
事前準備
開始之前,請先執行下列操作:
如果您尚未安裝 Bazel,請先完成安裝。
如果您不熟悉 Bazel 及其概念,請完成 iOS 應用程式教學課程)。您應瞭解 Bazel 工作區,包括
WORKSPACE
和BUILD
檔案,以及 目標、建構規則和 Bazel 套件的概念。分析並瞭解專案的依附元件。
分析專案依附元件
與 Xcode 不同的是,Bazel 會要求您明確宣告
BUILD
檔案中的每個目標。
如要進一步瞭解外部依附元件,請參閱 使用外部依附元件。
使用 Bazel 建構或測試 Xcode 專案
如要使用 Bazel 建構或測試 Xcode 專案,請按照下列步驟操作:
-
a. 新增應用程式目標
b. (選用) 新增測試目標
c. 新增程式庫目標
步驟 1:建立 WORKSPACE
檔案
在新目錄中建立 WORKSPACE
檔案。這個目錄會成為 Bazel
。如果專案沒有外部依附元件,則這個檔案
並將空無一物。如果專案依附的檔案或套件不在
專案的目錄,請在 WORKSPACE
指定這些外部依附元件
檔案。
步驟 2:(實驗功能) 整合 CocoaPods 依附元件
如要將 CocoaPods 依附元件整合至 Bazel 工作區,您必須 請依照轉換 CocoaPods 依附元件中的說明,將 CocoaPods 依附元件轉換為 Bazel 套件。
步驟 3:建立 BUILD
檔案
定義工作區和外部依附元件後,請
建立 BUILD
檔案,告知 Bazel 專案如何結構。創作
BUILD
檔案,並將其設定為執行
執行這個專案:
提示:如要進一步瞭解套件和其他 Bazel 概念,請參閱 工作區、套件及目標。
步驟 3a:新增應用程式目標
新增macos_application
或 ios_application
規則目標。這個目標會分別建構 macOS 或 iOS 應用程式套件。
在目標中,至少指定下列項目:
bundle_id
:應用程式的軟體包 ID (reverse-DNS 路徑,後接應用程式名稱) 二進位檔案。provisioning_profile
- 來自 Apple Developer 的佈建設定檔 帳戶 (若為 iOS 裝置建構)。families
(僅限 iOS) - 是否建構適用於 iPhone、iPad、 或兩者並行infoplists
- 要合併到最終 Info.plist 檔案的 .plist 檔案清單。minimum_os_version
- 提供的 macOS 或 iOS 最低版本 應用程式。這可確保 Bazel 使用 正確的 API 級別
步驟 3b:(選用) 新增測試目標
Bazel 的 Apple 建構規則支援 在 iOS、macOS 和 以及在 macOS 上進行測試針對 iOS 或 Bazel 就會建構測試輸出內容,但必須在 Xcode 內執行 執行 Tulsi 產生的專案新增測試目標,如下所示:
macos_unit_test
:在 macOS 上執行程式庫和應用程式單元測試。ios_unit_test
敬上 ,在 iOS 上執行程式庫式單元測試。針對需要 iOS 裝置的測試 Bazel 會建構測試輸出內容,但不會執行測試。您必須 使用 Tulsi 產生 Xcode 專案 並在 Xcode 內進行測試ios_ui_test
敬上 ,以便在 iOS 模擬工具中執行使用者介面測試時所需的輸出內容 即可。您必須使用 Tulsi 產生 Xcode 專案 並在 Xcode 內進行測試Bazel 無法原生執行 UI 測試。
請至少指定 minimum_os_version
屬性的值。雖然
其他包裝屬性,例如 bundle_identifier
和 infoplists
預設為最常用的值,請確保這些預設值能相容
並視需求進行調整針對需要 iOS 裝置的測試
模擬工具,也會將 ios_application
目標名稱指定為
test_host
屬性。
步驟 3c:新增程式庫目標
新增objc_library
一個目標 C 程式庫為目標,另一個則是 swift_library
。
目標。
新增資料庫目標如下:
將應用程式程式庫目標新增為應用程式的依附元件 目標。
將測試程式庫目標新增為測試目標的依附元件。
在
srcs
屬性中列出實作來源。請在
hdrs
屬性中列出標頭。
如要進一步瞭解建構規則,請參閱 Bazel 的 Apple 規則。
此時,建議您測試版本:
bazel build //:<application_target>
步驟 4:(選用) 將建構進行精細化
如果專案規模龐大或是持續成長,請考慮將專案分成多個部分 Bazel 套件這麼做可提升精細程度,帶來以下好處:
增加版本增幅
提高建構工作的平行處理能力,
日後使用者更容易維護
更有效地控管目標和套件中的原始碼。這個 避免程式庫包含實作詳細資料外洩的情況 轉換為公用 API
將專案精細化的訣竅:
將每個程式庫都放在專屬的 Bazel 套件中。針對需要 盡可能減少依附元件,並向上擴充依附元件樹狀結構。
加入
BUILD
檔案並指定指定目標時,請將這些新的目標加進 依附於目標的deps
屬性。glob()
函式不會跨套件邊界,因此與這個數字一樣 的套件會增加glob()
比對相符的檔案。將
BUILD
檔案新增至main
目錄時,請一併將BUILD
檔案加入 對應的test
目錄在所有套件中強制執行健康的瀏覽權限限制。
每次對
BUILD
檔案進行重大變更後,請建構專案並修正問題 建構錯誤
步驟 5:執行版本
執行完整遷移的建構作業,確保完成時沒有錯誤或警告。 執行每個應用程式並個別測試目標,更輕鬆地找到來源 任何發生的錯誤
例如:
bazel build //:my-target
步驟 6:使用 Tulsi 產生 Xcode 專案
使用 Bazel 建構時,WORKSPACE
和 BUILD
檔案會成為來源檔案
確切的建構內容如要讓 Xcode 瞭解此狀況,您必須產生
使用 Tulsi 執行與 Bazel 相容的 Xcode 專案。
疑難排解
當 Bazel 與所選 Xcode 版本未同步,就會發生 Bazel 錯誤 例如套用更新如果您遇到這種情況,請嘗試以下做法 Xcode 發生錯誤,例如「必須指定 Xcode 版本 請使用 Apple CROSSTOOL」。
手動執行 Xcode 並接受所有條款及細則。
使用 Xcode 選取表示正確版本、接受授權,以及 清除 Bazel 的狀態
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license
bazel sync --configure
- 如果這個方法無效,也可以嘗試執行
bazel clean --expunge
。