ルールの互換性

問題を報告する ソースを表示

Bazel Starlark ルールでは、次の 2 つのシナリオで Bazel LTS リリースとの互換性が損なわれる可能性があります。

  1. このルールは、依存する機能が Bazel から Bazel から削除されるため、今後の LTS リリースとの互換性が損なわれます。
  2. このルールは、依存している機能が新しい Bazel LTS リリースでのみ使用できるため、現行の LTS リリースまたは古い LTS リリースとの互換性が損なわれます。

一方、ルール自体で、互換性のない変更をユーザーに送信することもできます。Bazel バージョンで互換性を破る変更と組み合わせることで、ルール バージョンと Bazel バージョンのアップグレードが Bazel ユーザーに不満を生じさせることがよくあります。このページでは、ユーザーが Bazel とルールを簡単にアップグレードできるように、ルールの作成者が Bazel とルールの互換性を維持する方法について説明します。

管理しやすい移行プロセス

Bazel のすべてのバージョンとルールのすべてのバージョン間の互換性を保証することは不可能です。しかし、Google の目的は、Bazel ユーザーが移行プロセスを管理できるようにすることです。管理可能な移行プロセスは、ユーザーにルールのメジャー バージョンと Bazel のメジャー バージョンを同時にアップグレードすることを強制しないプロセスで、互換性のない変更を一度に 1 つのソースから処理できるようにします。

たとえば、次のような互換性マトリックスを使用します。

  • rules_foo 1.x と Bazel 4.x から rules_foo 2.x と Bazel 5.x への移行は、ユーザーが rules_foo と Bazel のメジャー バージョンを同時にアップグレードする必要があるため、管理しやすいとは見なされません。
  • rules_foo 2.x と Bazel 5.x から rules_foo 3.x と Bazel 6.x への移行は、ユーザーが rules_foo をメジャー Bazel バージョンを変更せずに 2.x から 3.x にアップグレードしてから Bazel 5.x から 6.x にアップグレードできるため、管理しやすいとみなされます。
rules_foo 1.x rules_foo 2.x rules_foo 3.x HEAD
Bazel 4.x
Bazel 5.x
Bazel 6.x
HEAD

❌: Bazel LTS リリースと互換性のあるメジャー ルール バージョンがない。

✅: 少なくとも 1 つのバージョンのルールが、最新バージョンの Bazel LTS リリースと互換性がある。

おすすめの方法

Bazel ルールの作成者は、次のベスト プラクティスに沿ってユーザーの管理プロセスを簡単に移行できます。

  1. ルールはセマンティック バージョニングに従う必要があります。同じメジャー バージョンのマイナー バージョンには下位互換性があります。
  2. HEAD のルールは最新の Bazel LTS リリースに対応している必要があります。
  3. HEAD のルールは Bazel と Bazel に対応している。これを行うには、次の操作を行います。
  4. ルールの最新のメジャー バージョンは、最新の Bazel LTS リリースと互換性がある必要があります。
  5. ルールの新しいメジャー バージョンは、ルールの以前のメジャー バージョンでサポートされる最新の Bazel LTS リリースと互換性がある必要があります。

2. と 3. の確立は 4. と 5 の達成を可能にするため、最も重要なタスクです。。

ルールの作成者は、HEAD の Bazel と最新の Bazel LTS リリースの両方との互換性を維持しやすくするために、次のことができます。

  • 下位互換性のある機能を最新の LTS リリースにバックポートするようにリクエストするには、リリース プロセスで詳細を確認してください。
  • Bazel 機能の検出を行うには、bazel_features を使用します。

一般に、おすすめする方法では、Bazel と互換性のない変更に対してルールを移行し、最新の Bazel LTS リリースとの互換性を損なうことなく、HEAD で新しい Bazel 機能を使用できます。