このページでは、Bazel を使用して Xcode プロジェクトをビルドまたはテストする方法について説明します。Xcode と Bazel の違いと、Xcode プロジェクトを Bazel プロジェクトに変換する手順について説明します。また、一般的なエラーに対処するためのトラブルシューティング ソリューションも提供します。
Xcode と Bazel の違い
Bazel では、すべてのビルド ターゲットとその依存関係、および対応するビルド設定をビルドルールで明示的に指定する必要があります。
Bazel では、プロジェクトが依存するすべてのファイルがワークスペース ディレクトリ内に存在するか、
MODULE.bazelファイルで依存関係として指定されている必要があります。Bazel で Xcode プロジェクトをビルドする場合、
BUILDファイルが信頼できる情報源になります。Xcode でプロジェクトを操作する場合は、 rules_xcodeproj を使用してBUILDファイルと一致する新しいバージョンの Xcode プロジェクトを生成する必要があります。BUILDターゲットに依存関係を追加するなど、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 ワークスペースに統合するには、 swift_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 でビルドする場合、MODULE.bazel ファイルと 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を実行してみてください。