Xcode から Bazel への移行

問題を報告する ソースを表示 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

このページでは、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 コマンドは、このガイドで後述する制限付きでビルド機能とテスト機能を提供します。

始める前に

始める前に、次のことを行います。

  1. まだインストールしていない場合は、Bazel をインストールします。

  2. Bazel とそのコンセプトに慣れていない場合は、iOS アプリのチュートリアルを完了してください。MODULE.bazel ファイルと BUILD ファイル、ターゲット、ビルドルール、Bazel パッケージのコンセプトなど、Bazel ワークスペースを理解している必要があります。

  3. プロジェクトの依存関係を分析して把握します。

プロジェクトの依存関係を分析する

Xcode とは異なり、Bazel では BUILD ファイル内のすべてのターゲットの依存関係を明示的に宣言する必要があります。

外部依存関係の詳細については、外部依存関係の操作をご覧ください。

Bazel を使用して Xcode プロジェクトをビルドまたはテストする

Bazel を使用して Xcode プロジェクトをビルドまたはテストするには、次の操作を行います。

  1. MODULE.bazel ファイルを作成する

  2. (試験運用版)SwiftPM の依存関係を統合

  3. BUILD ファイルを作成します。

    a. アプリケーション ターゲットを追加する

    b. (省略可)テスト ターゲットを追加する

    c. ライブラリ ターゲットを追加する

  4. (省略可)ビルドを細分化する

  5. ビルドを実行する

  6. rules_xcodeproj を使用して 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 シミュレータでユーザー インターフェース テストをビルドして実行します。

  • 同様のテストルールは、tvOSwatchOSvisionOS にも存在します。

少なくとも、minimum_os_version 属性の値を指定します。bundle_identifierinfoplists などの他のパッケージング属性は、最も一般的に使用される値にデフォルト設定されますが、これらのデフォルトがプロジェクトと互換性があることを確認し、必要に応じて調整してください。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 の実行もお試しください。