Bazel 教學課程:建構 iOS 應用程式

本教學課程說明如何使用 Bazel 建構簡單的 iOS 應用程式。

課程內容

在本教學課程中,您將瞭解以下內容:

  • 安裝 Bazel 和 Xcode 並下載範例專案,藉此設定環境
  • 設定包含應用程式原始碼的 Bazel 工作區,以及識別工作區目錄頂層的 WORKSPACE 檔案
  • 更新 WORKSPACE 檔案,以包含必要外部依附元件的參照
  • 建立 BUILD 檔案
  • 執行 Bazel,為模擬器和 iOS 裝置建構應用程式
  • 在模擬器和 iOS 裝置上執行應用程式

設定環境

如要開始使用,請安裝 Bazel 和 Xcode,然後取得範例專案。

安裝 Bazel

請按照安裝操作說明安裝 Bazel 及其依附元件。

安裝 Xcode

下載並安裝 Xcode。Xcode 包含 Bazel 用來建構 Apple 應用程式所需的編譯器、SDK 和其他工具。

取得範例專案

您也需要從 GitHub 取得教學課程的範例專案。GitHub 存放區有兩個分支版本:source-onlymainsource-only 分支版本僅包含專案的來源檔案。您將在本教學課程中使用這個分支版本中的檔案。main 分支版本包含來源檔案及已完成的 Bazel WORKSPACEBUILD 檔案。您可以在完成教學課程步驟後,使用這個分支版本中的檔案檢查工作。

在指令列中輸入以下內容,取得 source-only 分支版本中的檔案:

cd $HOME
git clone -b source-only https://github.com/bazelbuild/examples

git clone 指令會建立一個名為 $HOME/examples/ 的目錄。這個目錄包含多個 Bazel 專案範例。本教學課程的專案檔案位於 $HOME/examples/tutorial/ios-app 中。

設定工作區

工作區是一個目錄,其中包含一或多個軟體專案的來源檔案,以及 WORKSPACE 檔案和 BUILD 檔案,其中含有 Bazel 用來建構軟體的指示。工作區也可能含有輸出目錄的符號連結。

工作區目錄位於檔案系統中的任何位置,且會在根層級有 WORKSPACE 檔案來表示。在本教學課程中,工作區目錄是 $HOME/examples/tutorial/,其中包含您在上一個步驟中從 GitHub 存放區複製的範例專案檔案。

為了方便起見,請立即設定 $WORKSPACE 環境變數以參照工作區目錄。在指令列中輸入:

export WORKSPACE=$HOME/examples/tutorial

建立 WORKSPACE 檔案

每個工作區都必須在頂層工作區目錄中有一個名為 WORKSPACE 的文字檔案。這個檔案可能是空白的,或者可能包含建構軟體所需的外部依附元件參照。

目前,您將建立空白的 WORKSPACE 檔案,該檔案僅用於識別工作區目錄。在後續步驟中,您將更新檔案以新增外部依附元件資訊。

在指令列中輸入以下內容:

touch $WORKSPACE/WORKSPACE
open -a Xcode $WORKSPACE/WORKSPACE

這項操作會建立並開啟空白的 WORKSPACE 檔案。

更新 WORKSPACE 檔案

如要建構適用於 Apple 裝置的應用程式,Bazel 必須從 GitHub 存放區提取最新的 Apple 建構規則。如要啟用這項功能,請在 WORKSPACE 檔案中加入以下 git_repository 規則:

load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

git_repository(
    name = "build_bazel_rules_apple",
    remote = "https://github.com/bazelbuild/rules_apple.git",
    tag = "0.19.0",
)

git_repository(
    name = "build_bazel_rules_swift",
    remote = "https://github.com/bazelbuild/rules_swift.git",
    tag = "0.13.0",
)

git_repository(
    name = "build_bazel_apple_support",
    remote = "https://github.com/bazelbuild/apple_support.git",
    tag = "0.7.2",
)

git_repository(
    name = "bazel_skylib",
    remote = "https://github.com/bazelbuild/bazel-skylib.git",
    tag = "0.9.0",
)

檢查來源檔案

查看位於 $WORKSPACE/ios-app/UrlGet 的應用程式來源檔案。再次提醒您,您現在只要查看這些檔案,就能熟悉應用程式的結構。不必編輯任何來源檔案,即可完成本教學課程。

建立 BUILD 檔案

在指令列提示中,開啟新的 BUILD 檔案進行編輯:

touch $WORKSPACE/ios-app/BUILD
open -a Xcode $WORKSPACE/ios-app/BUILD

新增規則載入陳述式

為了建構 iOS 目標,Bazel 必須在每次建構時從 GitHub 存放區載入建構規則。如要為專案提供這些規則,請在 BUILD 檔案的開頭加入以下載入陳述式:

load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")

您僅須載入 ios_application 規則,因為 objc_library 規則已內建於 Bazel 套件中。

新增 objc_library 規則

Bazel 提供了多種建構規則,可用於建構適用於 iOS 平台的應用程式。在本教學課程中,您必須先使用 objc_library 規則,告知 Bazel 如何從應用程式原始碼和 Xib 檔案建構靜態資料庫。接著,您將使用 ios_application 規則,告知如何建構應用程式二進位檔和 .ipa 套件。

請將以下內容新增到 BUILD 檔案中:

objc_library(
    name = "UrlGetClasses",
    srcs = [
         "UrlGet/AppDelegate.m",
         "UrlGet/UrlGetViewController.m",
         "UrlGet/main.m",
    ],
    hdrs = glob(["UrlGet/*.h"]),
    data = ["UrlGet/UrlGetViewController.xib"],
)

請記下規則名稱:UrlGetClasses

新增 ios_application 規則

ios_application 規則會建構應用程式二進位檔,並建立 .ipa 套件檔案。

請將以下內容新增到 BUILD 檔案中:

ios_application(
    name = "ios-app",
    bundle_id = "Google.UrlGet",
    families = [
        "iphone",
        "ipad",
    ],
    minimum_os_version = "9.0",
    infoplists = [":UrlGet/UrlGet-Info.plist"],
    visibility = ["//visibility:public"],
    deps = [":UrlGetClasses"],
)

請注意,deps 屬性會如何參照您在上述 BUILD 檔案中加入的 UrlGetClasses 規則的輸出內容。

現在,請儲存並關閉檔案。您可以將 BUILD 檔案與 GitHub 存放區 main 分支版本中的完整範例進行比較。

建構及部署應用程式

您現在可以建構應用程式,並部署至模擬器和 iOS 裝置。

建構的應用程式位於 $WORKSPACE/bazel-bin 目錄中。

本教學課程已完成的 WORKSPACEBUILD 檔案位於 GitHub 存放區的主要分支版本中。您可以將工作與完成的檔案進行比較,取得進一步協助或疑難排解資訊。

建構用於模擬器的應用程式

確認目前的工作目錄位於 Bazel 工作區中:

cd $WORKSPACE

現在,請輸入下列指令來建構範例應用程式:

bazel build //ios-app:ios-app

Bazel 會啟動並建構範例應用程式。在建構過程中,其輸出內容會與以下內容類似:

INFO: Found 1 target...
Target //ios-app:ios-app up-to-date:
  bazel-bin/ios-app/ios-app.ipa
INFO: Elapsed time: 0.565s, Critical Path: 0.44s

尋找建構輸出內容

.ipa 檔案和其他輸出內容位於 $WORKSPACE/bazel-bin/ios-app 目錄中。

在模擬器中執行應用程式並進行偵錯

您現在可以使用 iOS 模擬器,透過 Xcode 執行應用程式。首先,請使用 Tulsi 產生 Xcode 專案

接著,在 Xcode 中開啟專案,選擇 iOS 模擬器做為執行階段配置,然後按一下「Run」

為裝置建構應用程式

如要建構應用程式,以便在 iOS 裝置上安裝及啟動,Bazel 需要該裝置型號適用的適當佈建設定檔。請完成下列步驟:

  1. 前往您的 Apple Developer 帳戶,為您的裝置下載適當的佈建設定檔。詳情請參閱 Apple 說明文件

  2. 將你的個人資料移至「$WORKSPACE」。

  3. (選用) 將設定檔加進 .gitignore 檔案。

  4. BUILD 檔案的 ios_application 目標中新增下列程式碼:

    provisioning_profile = "<your_profile_name>.mobileprovision",
    

現在,請為裝置建構應用程式:

bazel build //ios-app:ios-app --ios_multi_cpus=armv7,arm64

這會將應用程式建構為脂肪二進位檔。如要針對特定裝置架構進行建構,請在建構選項中指定此架構。

如要針對特定 Xcode 版本進行建構,請使用 --xcode_version 選項。如要進行特定 SDK 版本的建構,請使用 --ios_sdk_version 選項。--xcode_version 選項在大多數情況下都夠用。

如要指定最低 iOS 版本,請將 minimum_os_version 參數加入 BUILD 檔案的 ios_application 建構規則。

您也可以使用 Tulsi 來使用 GUI (而非指令列) 建構應用程式。

在裝置上安裝應用程式

在裝置上安裝應用程式最簡單的方法是啟動 Xcode 並使用 Windows > Devices 指令。在左側清單中選取已插入的裝置,然後按一下「已安裝的應用程式」下方的「新增」 (加號) 按鈕,接著選取您建構的 .ipa 檔案以新增應用程式。

如果應用程式無法安裝在裝置上安裝,請確認您在 BUILD 檔案中指定正確的佈建設定檔 (前一節的步驟 4)。

如果您的應用程式無法啟動,請確認裝置已加入佈建設定檔。Xcode 中 Devices 畫面上的 View Device Logs 按鈕可能會提供其他資訊,指出問題所在。

其他資訊

詳情請參閱 GitHub 存放區的主要分支版本