ルールの互換性

問題を報告 ソースを表示 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel Starlark ルールが原因で、Bazel LTS リリースとの互換性が 次の 2 つのシナリオがあります

  1. このルールは、依存する機能が HEAD の Bazel から削除されているため、今後の LTS リリースとの互換性を破ります。
  2. このルールは、依存する機能が新しい Bazel LTS リリースでのみ使用できるため、現在の LTS リリースまたはそれ以前の LTS リリースとの互換性を破ります。

一方、ルール自体がユーザーにとって互換性のない変更を送信することもあります。Bazel の破壊的変更と組み合わせると、ルールのバージョンと Bazel のバージョンをアップグレードすることが、Bazel ユーザーの不満の原因になることがあります。この では、ルールの作成者が Bazel とのルールの互換性を維持し、 Bazel とルールをアップグレードしやすくしました。

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

すべてのコンポーネント間の互換性を保証することは すべてのバージョンの Bazel とすべてのルールで互換性を失うことはありません。目標は、 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 を 2.x から Bazel のメジャー バージョンを変更せずに 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. ルールは、Semantic バージョニング: 同じサービスのマイナー バージョン 下位互換性があります。
  2. HEAD のルールは、最新の Bazel LTS リリースと互換性がある必要があります。
  3. HEAD のルールは、HEAD の Bazel と互換性がある必要があります。これを実現するには、次の手順を行います。
  4. ルールの最新のメジャー バージョンは、最新の Bazel LTS リリースと互換性がある必要があります。
  5. ルールの新しいメジャー バージョンは、最後の Bazel LTS と互換性がある必要があります 以前のメジャー バージョンでサポートされていたリリースを指します。

2. および 3. を達成することが最も重要なタスクであり、4. および 3. を達成することが 5.生成できます。

HEAD の Bazel と最新バージョンの両方との互換性を簡単に維持できるように Bazel LTS リリースの場合、ルール作成者は次のことができます。

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

一般に、推奨されるアプローチでは、最新の Bazel LTS リリースとの互換性を失うことなく、Bazel との互換性のない変更に対してルールを移行し、HEAD で新しい Bazel 機能を使用できます。