このチュートリアルでは、Bazel を使用して簡単な iOS アプリを作成する方法について説明します。
学習内容
このチュートリアルでは、以下の方法について学習します。
- Bazel と Xcode をインストールし、 サンプル プロジェクトをダウンロードして環境を設定する
- アプリのソースコードと、ワークスペース ディレクトリの最上位レベルを識別する
WORKSPACEファイルを含む Bazel ワークスペースを設定する - 必要な
外部依存関係への参照を含むように
WORKSPACEファイルを更新する BUILDファイルを作成する- Bazel を実行して、シミュレータと iOS デバイス用のアプリをビルドする
- シミュレータと iOS デバイスでアプリを実行する
環境の設定
まず、Bazel と Xcode をインストールし、サンプル プロジェクトを取得します。
Bazel をインストールする
インストール手順に沿って、Bazel と その依存関係をインストールします。
Xcode をインストールする
Xcode をダウンロードしてインストールします。 Xcode には、Apple アプリのビルドに必要なコンパイラ、SDK、その他のツールが含まれています。
サンプル プロジェクトを取得する
また、GitHub からチュートリアルのサンプル プロジェクトを取得する必要があります。GitHub
リポジトリには、source-only と main の 2 つのブランチがあります。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 にあります。
ワークスペースを設定する
ワークスペースは、1 つ以上のソフトウェア プロジェクトの
ソースファイルと、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 ビルドルール
を取得する必要があります。これを有効にするには、次の
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")
objc_library
ルールは Bazel パッケージに組み込まれているため、ios_application ルールのみを読み込む必要があります。
objc_library ルールを追加する
Bazel には、
iOS プラットフォーム用のアプリをビルドするために使用できるビルドルールがいくつか用意されています。このチュートリアルでは、まず
objc_library ルールを使用して、アプリのソースコードと Xib ファイルから静的ライブラリをビルドする方法を Bazel
に伝えます。次に、
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 ディレクトリにあります。
このチュートリアルの完成した 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 シミュレータを選択して、 [実行] をクリックします。
デバイス用のアプリをビルドする
iOS デバイスにインストールして起動できるようにアプリをビルドするには、Bazel に そのデバイスモデルの適切なプロビジョニング プロファイルが必要です。次のように対応します。
Apple Developer Account にアクセスし、 デバイスに適したプロビジョニング プロファイルをダウンロードします。詳細については、 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 の最小バージョンを指定するには、BUILD ファイルの ios_application ビルドルールに minimum_os_version
パラメータを追加します。
デバイスにアプリをインストールする
デバイスにアプリをインストールする最も簡単な方法は、Xcode を起動して
Windows > Devices コマンドを使用することです。左側のリストから接続したデバイスを選択し、
[追加](プラス記号)ボタンをクリックして、
[Installed Apps] の下にある .ipa ファイルを選択してアプリを追加します。
アプリがデバイスにインストールされない場合は、
正しいプロビジョニング プロファイルを BUILD ファイルで指定していることを確認してください(前の
セクションの手順 4)。
アプリが起動しない場合は、デバイスが
プロビジョニング プロファイルに含まれていることを確認してください。Xcode の Devices 画面の View Device Logs ボタンをクリックすると、問題の原因に関するその他の情報が表示されることがあります。
関連情報
詳細については、 メインブランチ の GitHub リポジトリをご覧ください。