このページでは、Bazel を使用して Xcode プロジェクトをビルドまたはテストする方法について説明します。Xcode と Bazel の違いについて説明し、Xcode プロジェクトを Bazel プロジェクトに変換する手順を示します。また、一般的なエラーに対処するためのトラブルシューティング ソリューションも提供します。
Xcode と Bazel の違い
Bazel では、すべてのビルド ターゲットとその依存関係、および対応するビルド設定をビルドルールで明示的に指定する必要があります。
Bazel では、プロジェクトが依存するすべてのファイルがワークスペース ディレクトリ内にあるか、
MODULE.bazel
ファイルで依存関係として指定されている必要があります。Bazel で Xcode プロジェクトをビルドする場合、
BUILD
ファイルが信頼できる情報源になります。Xcode でプロジェクトを操作する場合は、BUILD
ファイルを更新するたびに、rules_xcodeproj を使用してBUILD
ファイルと一致する新しいバージョンの Xcode プロジェクトを生成する必要があります。ターゲットへの依存関係の追加など、BUILD
ファイルに対する特定の変更では、プロジェクトの再生成は不要です。これにより、開発をスピードアップできます。Xcode を使用していない場合、bazel build
コマンドとbazel test
コマンドは、このガイドで後述する制限付きでビルド機能とテスト機能を提供します。
始める前に
始める前に、次のことを行います。
まだインストールしていない場合は、Bazel をインストールします。
Bazel とそのコンセプトに慣れていない場合は、iOS アプリのチュートリアルを完了してください。
MODULE.bazel
ファイルとBUILD
ファイル、ターゲット、ビルドルール、Bazel パッケージのコンセプトなど、Bazel ワークスペースを理解している必要があります。プロジェクトの依存関係を分析して把握します。
プロジェクトの依存関係を分析する
Xcode とは異なり、Bazel では BUILD
ファイル内のすべてのターゲットの依存関係を明示的に宣言する必要があります。
外部依存関係の詳細については、外部依存関係の操作をご覧ください。
Bazel を使用して Xcode プロジェクトをビルドまたはテストする
Bazel を使用して Xcode プロジェクトをビルドまたはテストするには、次の操作を行います。
ステップ 1: MODULE.bazel
ファイルを作成する
新しいディレクトリに MODULE.bazel
ファイルを作成します。このディレクトリが Bazel ワークスペースのルートになります。プロジェクトで外部依存関係を使用しない場合、このファイルは空にできます。プロジェクトがプロジェクトのディレクトリにないファイルまたはパッケージに依存している場合は、これらの外部依存関係を MODULE.bazel
ファイルで指定します。
ステップ 2: (試験運用版)SwiftPM の依存関係を統合する
swift_bazel を使用して SwiftPM の依存関係を Bazel ワークスペースに統合するには、次のチュートリアルで説明されているように、それらを Bazel パッケージに変換する必要があります。
ステップ 3: BUILD
ファイルを作成する
ワークスペースと外部依存関係を定義したら、プロジェクトの構造を Bazel に伝える BUILD
ファイルを作成する必要があります。Bazel ワークスペースのルートに BUILD
ファイルを作成し、次のようにプロジェクトの初期ビルドを行うように構成します。
ヒント: パッケージやその他の Bazel のコンセプトの詳細については、ワークスペース、パッケージ、ターゲットをご覧ください。
ステップ 3a: アプリケーション ターゲットを追加する
macos_application
または ios_application
ルールターゲットを追加します。このターゲットは、それぞれ macOS または iOS アプリケーション バンドルをビルドします。ターゲットで、少なくとも次の項目を指定します。
bundle_id
- バイナリのバンドル ID(逆 DNS パスとアプリ名)。provisioning_profile
- Apple Developer アカウントのプロビジョニング プロファイル(iOS デバイス向けにビルドする場合)。families
(iOS のみ)- iPhone、iPad、または両方のアプリをビルドするかどうか。infoplists
- 最終的な Info.plist ファイルにマージする .plist ファイルのリスト。minimum_os_version
- アプリケーションがサポートする macOS または iOS の最小バージョン。これにより、Bazel は正しい API レベルでアプリケーションをビルドします。
ステップ 3b: (省略可)テスト対象を追加する
Bazel の Apple ビルドルールは、すべての Apple プラットフォームでのユニットテストと UI テストの実行をサポートしています。次のようにテスト ターゲットを追加します。
macos_unit_test
macOS でライブラリ ベースとアプリケーション ベースの単体テストを実行します。ios_unit_test
iOS でライブラリベースの単体テストをビルドして実行します。ios_ui_test
を使用して、iOS シミュレータでユーザー インターフェース テストをビルドして実行します。
少なくとも、minimum_os_version
属性の値を指定します。bundle_identifier
や infoplists
などの他のパッケージング属性は、最も一般的に使用される値にデフォルト設定されますが、これらのデフォルトがプロジェクトと互換性があることを確認し、必要に応じて調整してください。iOS シミュレータを必要とするテストの場合は、ios_application
ターゲット名を test_host
属性の値として指定します。
ステップ 3c: ライブラリ ターゲットを追加する
アプリケーションやテストが依存する Objective-C ライブラリごとに objc_library
ターゲットを追加し、Swift ライブラリごとに swift_library
ターゲットを追加します。
次のようにライブラリ ターゲットを追加します。
アプリケーション ライブラリ ターゲットをアプリケーション ターゲットの依存関係として追加します。
テスト ライブラリ ターゲットをテスト ターゲットの依存関係として追加します。
srcs
属性に実装ソースをリストします。hdrs
属性にヘッダーを一覧表示します。
さまざまなタイプのアプリケーションの既存の例は、rules_apple の例のディレクトリで直接確認できます。次に例を示します。
ビルドルールの詳細については、Bazel の Apple ルールをご覧ください。
この時点で、ビルドをテストすることをおすすめします。
bazel build //:<application_target>
ステップ 4:(省略可)ビルドを細分化する
プロジェクトが大きい場合や、プロジェクトが大きくなるにつれて、複数の Bazel パッケージに分割することを検討してください。この粒度を上げることで、次のことが可能になります。
ビルドの増分性が向上しました。
ビルドタスクの並列処理の増加、
将来のユーザーの保守性を向上させる。
ターゲットとパッケージ全体でソースコードの可視性をより細かく制御できるようになりました。これにより、実装の詳細を含むライブラリが公開 API にリークするなどの問題を防ぐことができます。
プロジェクトを細分化するためのヒント:
各ライブラリを独自の Bazel パッケージに配置します。依存関係が最も少ないものから始めて、依存関係ツリーを上に進んでいきます。
BUILD
ファイルを追加してターゲットを指定するときに、これらの新しいターゲットを、それらに依存するターゲットのdeps
属性に追加します。glob()
関数はパッケージの境界を越えないため、パッケージの数が増えるにつれて、glob()
で一致するファイルは縮小します。BUILD
ファイルをmain
ディレクトリに追加するときは、対応するtest
ディレクトリにもBUILD
ファイルを追加します。パッケージ全体で健全な公開設定の制限を適用します。
BUILD
ファイルに大きな変更を加えるたびにプロジェクトをビルドし、ビルドエラーが発生したらその都度修正します。
ステップ 5: ビルドを実行する
完全に移行されたビルドを実行して、エラーや警告なしで完了することを確認します。各アプリケーションとテスト ターゲットを個別に実行して、発生したエラーの原因を特定しやすくします。
次に例を示します。
bazel build //:my-target
ステップ 6: rules_xcodeproj で Xcode プロジェクトを生成する
Bazel でビルドする場合、MODULE.bazel
ファイルと BUILD
ファイルがビルドに関する信頼できる情報源になります。Xcode にこれを認識させるには、rules_xcodeproj を使用して Bazel 互換の Xcode プロジェクトを生成する必要があります。
トラブルシューティング
Bazel エラーは、選択した Xcode バージョンとの同期が取れていない場合に発生する可能性があります(更新を適用した場合など)。Xcode でエラー(「Xcode バージョンは Apple CROSSTOOL を使用するために指定する必要があります」など)が発生した場合は、次の手順をお試しください。
Xcode を手動で実行し、利用規約に同意します。
Xcode select を使用して正しいバージョンを指定し、ライセンスに同意して、Bazel の状態をクリアします。
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license
bazel sync --configure
- それでも解決しない場合は、
bazel clean --expunge
の実行もお試しください。