このチュートリアルでは、Bazel を使用して簡単な iOS アプリを作成する方法について説明します。
学習内容
このチュートリアルでは、以下の方法について学習します。
- Bazel と Xcode をインストールしてサンプル プロジェクトをダウンロードし、環境を設定する
- アプリのソースコードと、ワークスペース ディレクトリの最上位を識別する
WORKSPACE
ファイルを含む Bazel ワークスペースをセットアップします。 WORKSPACE
ファイルを更新して、必要な外部依存関係への参照を含めます。BUILD
ファイルを作成する- Bazel を実行して、シミュレータ用のアプリと iOS デバイス用のアプリをビルドします
- シミュレータと iOS デバイスでアプリを実行する
環境を設定する
使用を開始するには、Bazel と Xcode をインストールして、サンプル プロジェクトを入手します。
Bazel をインストールする
インストール手順に沿って、Bazel とその依存関係をインストールします。
Xcode をインストールする
Xcode をダウンロードしてインストールします。Xcode には、Bazel が 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 ビルドルールを pull する必要があります。有効にするには、次の 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 Simulator を選択し、[実行] をクリックします。
デバイス向けアプリを作成する
iOS デバイスでインストールと起動が行われるようにアプリをビルドするには、Bazel にそのデバイスモデルに適したプロビジョニング プロファイルが必要です。手順は次のとおりです。
Apple Developer アカウントに移動し、デバイスに適したプロビジョニング プロファイルをダウンロードします。詳しくは、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
パラメータを追加します。
また、Tulsi を使用すると、コマンドラインではなく GUI を使用してアプリをビルドできます。
デバイスにアプリをインストールする
デバイスにアプリをインストールするには、Xcode を起動して Windows > Devices
コマンドを使用するのが最も簡単な方法です。左側のリストからプラグインしたデバイスを選択し、[Installed Apps] の下の追加ボタン(プラス記号)をクリックし、作成した .ipa
ファイルを選択してアプリを追加します。
デバイスにアプリをインストールできない場合は、BUILD
ファイルに正しいプロビジョニング プロファイルを指定していることを確認します(前のセクションの手順 4)。
アプリの起動に失敗した場合は、デバイスがプロビジョニング プロファイルに含まれていることを確認します。Xcode の Devices
画面の View Device Logs
ボタンから、何が問題なのかに関するその他の情報が得られる場合があります。
参考資料
詳しくは、GitHub リポジトリのメインブランチをご覧ください。