ルールの互換性

問題を報告 ソースを表示

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

  1. このルールは、依存する機能が HEAD で Bazel から削除されているため、将来の LTS リリースとの互換性が損なわれます。
  2. このルールは、依存する機能が新しい Bazel 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 への移行は管理可能と見なされます。ユーザーは最初に 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 の新機能を使用できます。