このページでは、Bazel を使用して Xcode プロジェクトをビルドまたはテストする方法について説明します。Xcode と Bazel の違いと、Xcode プロジェクトを Bazel プロジェクトに変換する手順について説明します。また、一般的なエラーに対処するためのトラブルシューティング ソリューションも提供します。
Xcode と Bazel の違い
Bazel では、すべてのビルド ターゲットとその 依存関係、および対応するビルド設定をビルドルールで明示的に指定する必要があります。
Bazel では、プロジェクトが依存するすべてのファイルがワークスペース ディレクトリ内に存在するか、
WORKSPACEファイルでインポートとして指定されている必要があります。Bazel で Xcode プロジェクトをビルドする場合、
BUILDファイルが 信頼できる情報源になります。Xcode でプロジェクトを操作する場合は、 rules_xcodeproj を使用してBUILDファイルと一致する新しいバージョンの Xcode プロジェクトを生成する必要があります。BUILDターゲットに依存関係を追加するなど、BUILDファイルに特定の変更を加えた場合は、プロジェクトを再生成する必要がないため、開発を迅速化できます。Xcode を使用していない場合、bazel buildコマンドとbazel testコマンドは、このガイドで後述する特定の制限付きでビルド機能とテスト機能を提供します。
始める前に
始める前に、次のことを行います。
Bazel をインストールしますまだインストールしていない場合は、。
Bazel とそのコンセプトに慣れていない場合は、 iOS アプリのチュートリアルを完了してください。Bazel ワークスペース(
WORKSPACEファイルとBUILDファイルを含む)、ターゲット、ビルドルール、Bazel パッケージの コンセプトを理解しておく必要があります。プロジェクトの依存関係を分析して理解します。
プロジェクトの依存関係を分析する
Xcode とは異なり、Bazel では、
ファイル内のすべてのターゲットの依存関係を明示的に宣言する必要があります。BUILD
外部依存関係の詳細については、 外部依存関係の操作をご覧ください。
Bazel を使用して Xcode プロジェクトをビルドまたはテストする
Bazel を使用して Xcode プロジェクトをビルドまたはテストする手順は次のとおりです。
ステップ 1: WORKSPACE ファイルを作成する
新しいディレクトリに WORKSPACE ファイルを作成します。このディレクトリは Bazel
ワークスペースのルートになります。プロジェクトで外部依存関係を使用しない場合、このファイルは空にできます
。プロジェクトがプロジェクトのディレクトリにないファイルまたはパッケージに依存している場合は、
ファイルでこれらの外部依存関係を指定します。WORKSPACE
ステップ 2: (試験運用版)SwiftPM の依存関係を統合する
swift_bazel を使用して SwiftPM の依存関係を Bazel ワークスペースに統合するには、swift_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 の examples ディレクトリで直接確認できます。次に例を示します。
ビルドルールの詳細については、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 でエラーが発生した場合(「Xcode version must be specified to use an Apple CROSSTOOL」など)は、次のことを試してください。
Xcode を手動で実行し、利用規約に同意します。
Xcode select を使用して正しいバージョンを指定し、ライセンスに同意して、 Bazel の状態をクリアします。
sudo xcode-select -s /Applications/Xcode.app/Contents/Developersudo xcodebuild -licensebazel sync --configure
- これで解決しない場合は、
bazel clean --expungeを実行してみてください。