從 Xcode 遷移至 Bazel

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

本頁說明如何使用 Bazel 建構或測試 Xcode 專案。這項服務 說明 Xcode 和 Bazel 之間的差異 ,將 Xcode 專案轉換為 Bazel 專案。另外,這項產品也提供 來修正常見錯誤。

Xcode 和 Bazel 之間的差異

  • Bazel 需要您明確指定每個建構目標及其 依附元件,再加上透過建構規則所對應的建構設定。

  • Bazel 需要專案所在的所有檔案 工作區目錄中,或是指定為 WORKSPACE 中的匯入內容 檔案。

  • 使用 Bazel 建構 Xcode 專案時,BUILD 檔案會成為 可靠結果。如果您是在 Xcode 處理專案,則必須產生 新版與 BUILD 檔案相符的 Xcode 專案 每當您更新 BUILD 檔案時,Tulsi 就會是「Tulsi」。如果 您並未使用 Xcode,則 bazel buildbazel test 指令會提供 建構及測試功能,但有特定限制 指南。

  • 由於建構設定結構定義 (例如目錄版面配置) 的差異 或是建構標的,Xcode 可能無法完全瞭解的 因此某些 Xcode 功能可能無法運作名稱:

    • 視您在圖爾西為轉換選擇的目標而定,Xcode 可能會 無法正確為專案來源建立索引這會影響程式碼 但由於 Xcode 不會顯示 專案的原始碼中

    • 靜態分析、位址清理程式和執行緒清理程式可能無法 因為 Bazel 不會產生 Xcode 預期會輸出的 這些特徵的相對重要性

    • 如果您透過 Tulsi 產生 Xcode 專案,並透過該專案執行 進行測試時,Xcode 會執行測試,而不是 Bazel。如要使用 Bazel 執行測試,請手動執行 bazel test 指令。

事前準備

開始之前,請先執行下列操作:

  1. 如果您尚未安裝 Bazel,請先完成安裝。

  2. 如果您不熟悉 Bazel 及其概念,請完成 iOS 應用程式教學課程)。您應瞭解 Bazel 工作區,包括 WORKSPACEBUILD 檔案,以及 目標、建構規則和 Bazel 套件的概念。

  3. 分析並瞭解專案的依附元件。

分析專案依附元件

與 Xcode 不同的是,Bazel 會要求您明確宣告 BUILD 檔案中的每個目標。

如要進一步瞭解外部依附元件,請參閱 使用外部依附元件

使用 Bazel 建構或測試 Xcode 專案

如要使用 Bazel 建構或測試 Xcode 專案,請按照下列步驟操作:

  1. 建立 WORKSPACE 檔案

  2. (實驗功能) 整合 CocoaPods 依附元件

  3. 建立 BUILD 檔案:

    a. 新增應用程式目標

    b. (選用) 新增測試目標

    c. 新增程式庫目標

  4. (選用) 將建構作業精細化

  5. 執行建構

  6. 使用 Tulsi 產生 Xcode 專案

步驟 1:建立 WORKSPACE 檔案

在新目錄中建立 WORKSPACE 檔案。這個目錄會成為 Bazel 。如果專案沒有外部依附元件,則這個檔案 並將空無一物。如果專案依附的檔案或套件不在 專案的目錄,請在 WORKSPACE 指定這些外部依附元件 檔案。

步驟 2:(實驗功能) 整合 CocoaPods 依附元件

如要將 CocoaPods 依附元件整合至 Bazel 工作區,您必須 請依照轉換 CocoaPods 依附元件中的說明,將 CocoaPods 依附元件轉換為 Bazel 套件。

步驟 3:建立 BUILD 檔案

定義工作區和外部依附元件後,請 建立 BUILD 檔案,告知 Bazel 專案如何結構。創作 BUILD 檔案,並將其設定為執行 執行這個專案:

提示:如要進一步瞭解套件和其他 Bazel 概念,請參閱 工作區、套件及目標

步驟 3a:新增應用程式目標

新增macos_applicationios_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_identifierinfoplists 預設為最常用的值,請確保這些預設值能相容 並視需求進行調整針對需要 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 建構時,WORKSPACEBUILD 檔案會成為來源檔案 確切的建構內容如要讓 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
,瞭解如何調查及移除這項存取權。