このページでは、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 アプリのチュートリアルを完了してください。
WORKSPACEファイルとBUILDファイルを含む Bazel ワークスペース、ターゲット、ビルドルール、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 directoryで直接確認できます。次に例を示します。
ビルドルールの詳細については、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 バージョンを指定して Apple CROSSTOOL を使用する必要があります」など)、次のことを試してください。
Xcode を手動で実行し、利用規約に同意します。
Xcode select を使用して正しいバージョンを指定し、ライセンスに同意して、Bazel の状態をクリアします。
sudo xcode-select -s /Applications/Xcode.app/Contents/Developersudo xcodebuild -licensebazel sync --configure
- これで解決しない場合は、
bazel clean --expungeを実行してみてください。