このページでは、Bazel を使用して Xcode プロジェクトをビルドまたはテストする方法について説明します。Xcode と Bazel の違いと、Xcode プロジェクトを Bazel プロジェクトに変換する手順について説明します。また、一般的なエラーに対処するためのトラブルシューティング ソリューションについても説明します。
Xcode と Bazel の違い
Bazel では、すべてのビルド ターゲットとその依存関係、および対応するビルド設定をビルドルールで明示的に指定する必要があります。
Bazel では、プロジェクトが依存しているすべてのファイルがワークスペース ディレクトリに存在するか、
WORKSPACE
ファイルでインポートとして指定されている必要があります。Bazel を使用して Xcode プロジェクトをビルドすると、
BUILD
ファイルが信頼できる情報源になります。Xcode でプロジェクトを扱う場合は、BUILD
ファイルを更新するたびに、rules_xcodeproj を使用して、BUILD
ファイルに一致する新しいバージョンの Xcode プロジェクトを生成する必要があります。ターゲットへの依存関係の追加など、BUILD
ファイルへの変更では、プロジェクトを再生成する必要がないため、開発時間を短縮できます。Xcode を使用しない場合、bazel build
コマンドとbazel test
コマンドはビルドとテストの機能を提供しますが、このガイドで後述する制限事項もあります。
始める前に
始める前に、次のことを行います。
Bazel とそのコンセプトに精通していない場合は、iOS アプリのチュートリアルを完了してください。
WORKSPACE
ファイルとBUILD
ファイルなどの Bazel ワークスペースと、ターゲットのコンセプト、ビルドルール、Bazel パッケージについて理解しておく必要があります。プロジェクトの依存関係を分析して理解します。
プロジェクトの依存関係を分析する
Xcode とは異なり、Bazel では BUILD
ファイル内のすべてのターゲットのすべての依存関係を明示的に宣言する必要があります。
外部依存関係の詳細については、外部依存関係の操作をご覧ください。
Bazel を使用して Xcode プロジェクトをビルドまたはテストする
Bazel を使用して Xcode プロジェクトをビルドまたはテストする手順は次のとおりです。
ステップ 1: WORKSPACE
ファイルを作成する
新しいディレクトリに WORKSPACE
ファイルを作成します。このディレクトリが Bazel ワークスペースのルートになります。プロジェクトで外部依存関係を使用しない場合、このファイルは空にできます。プロジェクトがプロジェクトのディレクトリにないファイルまたはパッケージに依存している場合は、これらの外部依存関係を WORKSPACE
ファイルに指定します。
ステップ 2: (試験運用版)SwiftPM の依存関係を統合する
SwiftPM の依存関係を swift_bazel を使用して Bazel ワークスペースに統合するには、次のチュートリアルで説明されているように、Bazel パッケージに変換する必要があります。
ステップ 3: BUILD
ファイルを作成する
ワークスペースと外部依存関係を定義したら、プロジェクトの構造を Bazel に伝える BUILD
ファイルを作成する必要があります。Bazel ワークスペースのルートに BUILD
ファイルを作成し、次のようにプロジェクトの初期ビルドを実行するように構成します。
ヒント: パッケージと Bazel の他のコンセプトについては、ワークスペース、パッケージ、ターゲットをご覧ください。
ステップ 3a: アプリケーションのターゲットを追加する
macos_application
または ios_application
ルール ターゲットを追加します。このターゲットでは、それぞれ macOS または iOS のアプリケーション バンドルをビルドします。ターゲットでは、少なくとも次の項目を指定します。
bundle_id
- バイナリのバンドル ID(リバース DNS パスにアプリ名が続く)。provisioning_profile
- Apple デベロッパー アカウントからのプロファイルのプロビジョニング(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 でライブラリ ベースの単体テストをビルドして実行するための
ios_unit_test
。ios_ui_test
: iOS シミュレータでユーザー インターフェース テストをビルドして実行します。
少なくとも minimum_os_version
属性の値を指定します。bundle_identifier
や infoplists
などの他のパッケージ化属性はデフォルトで、最もよく使用される値に設定されますが、これらのデフォルト値がプロジェクトと互換性を持つことを確認し、必要に応じて調整します。iOS シミュレータが必要なテストでは、test_host
属性の値として ios_application
ターゲット名も指定します。
ステップ 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 でビルドする場合は、WORKSPACE
ファイルと BUILD
ファイルがビルドに関する信頼できる情報源になります。Xcode がこの問題を認識できるようにするには、rules_xcodeproj を使用して Bazel 互換の Xcode プロジェクトを生成する必要があります。
トラブルシューティング
Bazel エラーは、アップデートを適用したときなど、選択した Xcode バージョンと同期しなくなると発生することがあります。Xcode でエラー(Apple CROSSTOOL を使用するには Xcode バージョンを指定する必要があります)などのエラーが発生した場合は、次の手順を試してください。
Xcode を手動で実行し、利用規約に同意します。
Xcode の Select を使用して、正しいバージョンを指定し、ライセンスに同意し、Bazel の状態をクリアします。
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -license
bazel sync --configure
- それでも問題が解決しない場合は、
bazel clean --expunge
を実行してみてください。