本教程介绍如何使用 Bazel 构建简单的 iOS 应用。
学习内容
在本教程中,您将学习如何:
- 通过安装 Bazel 和 Xcode 并下载示例项目来设置环境
- 设置包含应用源代码的 Bazel 工作区,以及用于标识工作区目录顶级的
WORKSPACE文件 - 更新
WORKSPACE文件,使其包含对所需外部依赖项的引用 - 创建
BUILD文件 - 运行 Bazel 以针对模拟器和 iOS 设备构建应用
- 在模拟器和 iOS 设备上运行应用
设置环境
如需开始,请安装 Bazel 和 Xcode,并获取示例项目。
安装 Bazel
按照安装说明安装 Bazel 及其 依赖项。
安装 Xcode
下载并安装 Xcode。 Xcode 包含 Bazel 构建 Apple 应用所需的编译器、SDK 和其他工具。
获取示例项目
您还需要从 GitHub 获取本教程的示例项目。GitHub 代码库有两个分支:source-only 和 main。source-only 分支仅包含项目的源文件。在本教程中,您将使用此分支中的文件。main 分支同时包含源文件和已完成的 Bazel WORKSPACE 和 BUILD 文件。完成教程步骤后,您可以使用此分支中的文件来检查自己的工作。
在命令行中输入以下内容,以获取 source-only 分支中的文件:
cd $HOME
git clone -b source-only https://github.com/bazelbuild/examples
git clone 命令会创建一个名为 $HOME/examples/ 的目录。此目录包含多个 Bazel 示例项目。本教程的项目文件位于 $HOME/examples/tutorial/ios-app 中。
设置工作区
工作区是一个目录,其中包含一个或多个软件项目的源文件,以及包含 Bazel 用于构建软件的说明的 WORKSPACE 文件和 BUILD 文件。工作区还可能包含指向输出目录的符号链接。
工作区目录可以位于文件系统中的任意位置,并由其根目录中是否存在 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 构建规则
。如需启用此功能,请将以下
git_repository
规则添加到 WORKSPACE 文件中:
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
规则告知 Bazel 如何构建应用二进制文件和 .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 目录中。
本教程的已完成 WORKSPACE 和 BUILD 文件位于
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 需要该设备型号的相应预配配置文件。请执行以下操作:
前往您的 Apple 开发者账号 然后下载适合您设备的预配配置文件。如需了解详情,请参阅 Apple 文档 。
将您的配置文件移至
$WORKSPACE。(可选)将您的配置文件添加到
.gitignore文件中。将以下行添加到
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 命令。从左侧的列表中选择已插入的设备,然后点击“Installed Apps”下的 Add (加号)按钮,并选择您构建的 .ipa 文件,以添加应用。
如果应用无法安装在设备上,请确保您在 BUILD 文件中指定了正确的预配配置文件(上一部分中的第 4 步)。
如果应用无法启动,请确保您的设备是预配配置文件的一部分。Xcode 中 Devices 屏幕上的 View Device Logs 按钮可能会提供有关出错的其他信息。
深入阅读
如需了解详情,请参阅 主分支 GitHub 代码库。