ルールの互換性

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

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

  1. このルールは、依存している機能が HEAD の Bazel から削除されるため、将来の LTS リリースとの互換性を損ないます。
  2. このルールは、依存している機能が新しい Bazel LTS リリースでのみ使用可能であるため、現在または古い LTS リリースとの互換性を損ないます。

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

管理可能な移行プロセス

Bazel のすべてのバージョンとルールのすべてのバージョン間の互換性を保証することは明らかに不可能ですが、Bazel ユーザーにとって移行プロセスが管理可能な状態を維持することが Google の目標です。管理可能な移行プロセスとは、ユーザーがルールのメジャー バージョンと 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 への移行は、ユーザーがまず Bazel のメジャー バージョンを変更せずに rules_foo を 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 のルールは、HEAD の Bazel と互換性がある必要があります。これを行うには、
  4. ルールの最新のメジャー バージョンは、最新の Bazel LTS リリースと互換性がある必要があります。
  5. ルールの新しいメジャー バージョンは、ルールの以前のメジャー バージョンでサポートされている最後の Bazel LTS リリースと互換性がある必要があります。

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

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

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

一般に、推奨されるアプローチでは、Bazel と互換性のない変更に対してルールを移行し、最新の Bazel LTS リリースとの互換性を維持しながら、HEAD で新しい Bazel 機能を利用できるようにする必要があります。