Skip to main content

Command Palette

Search for a command to run...

用 Bazel 來建構 iOS App

Updated
•3 min read•View as Markdown

一、什麼是 Bazel

Bazel 是 Google 開發的免費建構軟體的工具,通常用在軟體的建構與測試上。詳細的官方使用說明可以去直接去官網參考:https://bazel.build/

二、為何要用 Bazel 來建構 iOS App

在開發 iOS App 使用 Xcode 就已經可以滿足所有需求,從開發、建構到測試。但在更大型的 App 的建構,將所有功能模組化開發,而在最後整合打包的時候使用 Bazel 會是更方便的選擇。

本篇文章將會說明如何利用 Bazel 來建構 iOS App,而這邊打包的 iOS App 範例是一個空白的專案,讓初學者更容易學習這個工具。

三、結論

先說結論,看完這篇可以學習到如何使用 Bazel 來將 iOS 的專案打包成 .ipa 檔案,可以直接安裝在手機上執行。

四、步驟說明

1 安裝 Xcode

直接到 App Store 下載安裝

2 安裝 brew

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

3 安裝 Bazel

$ brew install bazel

4 創建一個新的 iOS App 專案

  • 本範例使用 Xcode14.0 來創建
  • 使用 objective-C
  • 專案名稱為 App (可自由命名)
  • 在專案內的 Storyboard 建置一個 Label ,上面顯示 Hello App (可自由創作)

5 在 App 專案內的 Info.plist 新增 key

  • CFBundleVersion
  • CFBundleShortVersionString
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1</string>
  • 因為 Xcode 14.0 建立專案不會有這兩個 key,用 Bazel 會需要這兩個 key

6 建立工作資料夾

$ mkdir iOS
  • 資料夾名稱可自由命名

7 將 App 專案複製到工作資料夾內

所以工作資料夾的樹狀結構:

iOS
 - /App/...
 - App.xcodeproj

8 建立 WORKSPACE 檔案

$ touch WORKSPACE

9 更新 WORKSPACE 檔案

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "build_bazel_rules_apple",
    sha256 = "a19cf84dd060eda50be9ba5b0eca88377e0306ffbc1cc059df6a6947e48ac61a",
    url = "https://github.com/bazelbuild/rules_apple/releases/download/1.1.1/rules_apple.1.1.1.tar.gz",
)

load(
    "@build_bazel_rules_apple//apple:repositories.bzl",
    "apple_rules_dependencies",
)

apple_rules_dependencies()

load(
    "@build_bazel_rules_swift//swift:repositories.bzl",
    "swift_rules_dependencies",
)

swift_rules_dependencies()

load(
    "@build_bazel_rules_swift//swift:extras.bzl",
    "swift_rules_extra_dependencies",
)

swift_rules_extra_dependencies()

load(
    "@build_bazel_apple_support//lib:repositories.bzl",
    "apple_support_dependencies",
)

apple_support_dependencies()
  • 目的是讓 Bazel 讀取 Apple 建構規則
  • 最新更新可參考:https://github.com/bazelbuild/rules_apple

10 建立 BUILD 檔案

$ touch BUILD
  • 讓 Bazel 讀取建構作業流程

11 更新 BUILD 檔案

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

objc_library(
    name = "Lib",
    srcs = glob([
        "App/*.h",
        "App/*.m",
    ]),
    data = [
        "App/Base.lproj/LaunchScreen.storyboard",
        "App/Base.lproj/Main.storyboard",
    ],
)

ios_application(
    name = "App",
    bundle_id = "com.example.app",
    families = ["iphone", "ipad"],
    infoplists = [":App/Info.plist"],
    minimum_os_version = "15.0",
    deps = [":Lib"],
)

所以至此,工作資料內共有這些檔案:

iOS
    - /App/...
    - BUILD
    - WORKSPACE
    - App.xcodeproj

12 建構應用程式

直接在工作目錄底下:

$ bazel build App

成功會產生 .ipa

INFO: Analyzed target //:App (1 packages loaded, 12 targets configured).
INFO: Found 1 target...
Target //:App up-to-date:
  bazel-out/applebin_ios-ios_x86_64-fastbuild-ST-591a3331a341/bin/App.ipa
INFO: Elapsed time: 5.766s, Critical Path: 5.05s
INFO: 20 processes: 7 internal, 9 darwin-sandbox, 4 local.
INFO: Build completed successfully, 20 total actions

如果這一步發生失敗,確認 Xcode 跟 Xcode command line 已經安裝,並且執行:

$ bazel clean --expunge

此輸出只能在模擬器上執行,如果要在實體機上執行,需要填入 provisioning_profile

13 填入 provisioning_profile

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

objc_library(
    name = "Lib",
    srcs = glob([
        "App/*.h",
        "App/*.m",
    ]),
    data = [
        "App/Base.lproj/LaunchScreen.storyboard",
        "App/Base.lproj/Main.storyboard",
    ],
)

ios_application(
    name = "App",
    bundle_id = "com.example.app",
    families = ["iphone", "ipad"],
    infoplists = [":App/Info.plist"],
    minimum_os_version = "15.0",
    deps = [":Lib"],
    provisioning_profile = "provisioning_profile.mobileprovision",
)
  • 個人的 provisioning_profile 可以在 ~/Library/MobileDevice/Provisioning/Profiles 找到,並且複製到工作資料夾內

14 建構應用程式

$ bazel build App --ios_multi_cpus=armv7,arm64

成功會產生 .ipa

INFO: Analyzed target //:App (1 packages loaded, 13 targets configured).
INFO: Found 1 target...
Target //:App up-to-date:
  bazel-out/applebin_ios-ios_armv7-fastbuild-ST-3d7961f14ea2/bin/App.ipa
INFO: Elapsed time: 5.435s, Critical Path: 5.20s
INFO: 24 processes: 9 internal, 10 darwin-sandbox, 5 local.
INFO: Build completed successfully, 24 total actions

15 在裝置上安裝 .ipa

  • 啟動 Xcode,在方方工作列選取 Windows > Devices and Simulators
  • 在左側清單中選取已連接的裝置
  • 然後在 INSTALLED APPS 按加號按鈕,然後選取 .ipa,會自動安裝到手機上

以上步驟可以直接下載範例專案試用:iOS

五、參考

  • https://bazel.build/start/ios-app
  • https://github.com/bazelbuild/rules_apple
  • https://medium.com/deelvin-machine-learning/how-to-build-mediapipe-on-ios-f5e4cabf47f5

More from this blog

Vue3 101-1

前言 這個 Vue3 101 的系列,是一個關於 Vue3 的學習入門,我將會分享關於學習 Vue3 的一切基礎,所以非常適合從零開始想要接觸前端開發的朋友。 那麼學習 Vue3 需要會什麼樣的技術背景? 一點點的 HTML、一點點的 CSS 跟一點點的 JavaScript,就算完全沒有接觸過網頁開發,我也會希望可以藉由這個系列幫助到大家真的可以完全從不會到會。 Vue3 是一個前端開發者可以學習的框架,在前端框架數量爆炸的現今,除了 Vue3 之外,還有 React 、Next.js 等框架...

Aug 1, 20231 min read

JK 研習營

10 posts