Bazel チュートリアル: iOS アプリを作成する

問題を報告 ソースを表示

このチュートリアルでは、Bazel を使用してシンプルな iOS アプリを作成する方法について説明します。

学習内容

このチュートリアルでは、以下の方法について学習します。

  • Bazel と Xcode をインストールし、サンプル プロジェクトをダウンロードして環境を設定する
  • アプリのソースコードと、ワークスペース ディレクトリの最上位を識別する WORKSPACE ファイルを含む Bazel ワークスペースをセットアップします。
  • WORKSPACE ファイルを更新して、必要な外部依存関係への参照を含めます。
  • BUILD ファイルを作成する
  • Bazel を実行して、シミュレータと iOS デバイス用のアプリをビルドします。
  • シミュレータと iOS デバイスでアプリを実行する

環境を設定する

まず、Bazel と Xcode をインストールしてサンプル プロジェクトを入手します。

Bazel をインストールする

インストール手順に沿って、Bazel とその依存関係をインストールします。

Xcode をインストールする

Xcode をダウンロードしてインストールします。Xcode には、Bazel で Apple アプリケーションをビルドするために必要なコンパイラ、SDK、その他のツールが含まれています。

サンプル プロジェクトを取得する

また、GitHub からチュートリアルのサンプル プロジェクトを取得する必要もあります。GitHub リポジトリには、source-onlymain の 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 つ以上のソフトウェア プロジェクトのソースファイル、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

ルールの load ステートメントを追加する

iOS ターゲットをビルドするには、ビルドが実行されるたびに Bazel が GitHub リポジトリからビルドルールを読み込む必要があります。これらのルールをプロジェクトで使用できるようにするには、BUILD ファイルの先頭に次の load ステートメントを追加します。

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 Simulator を使用して Xcode からアプリを実行できるようになりました。まず、Tulsi を使用して Xcode プロジェクトを生成します

次に、Xcode でプロジェクトを開き、ランタイム スキームとして iOS Simulator を選択して、[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 バージョンを指定するには、BUILD ファイル内の ios_application ビルドルールに minimum_os_version パラメータを追加します。

また、Tulsi を使用すると、コマンドラインではなく GUI でアプリをビルドできます。

デバイスにアプリをインストールする

デバイスにアプリをインストールする最も簡単な方法は、Xcode を起動して Windows > Devices コマンドを使用することです。接続したデバイスを左側のリストから選択し、[Installed Apps] の下の [Add](プラス記号)ボタンをクリックして、ビルドした .ipa ファイルを選択してアプリを追加します。

アプリがデバイスにインストールされない場合は、BUILD ファイルで正しいプロビジョニング プロファイルを指定していることを確認してください(前のセクションのステップ 4)。

アプリを起動できない場合は、デバイスがプロビジョニング プロファイルに含まれていることを確認します。Xcode の Devices 画面にある View Device Logs ボタンを使用すると、何が問題だったかに関するその他の情報が提供される場合があります。

参考資料

詳細については、GitHub リポジトリのメインブランチをご覧ください。