ルールの互換性

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

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

  1. このルールにより、今後の LTS リリースとの互換性が損なわれます。 が HEAD で Bazel から削除されました。
  2. このルールにより、現行または古い LTS リリースとの互換性が失われます。 依存する機能が新しい Bazel 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 を 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. このルールはセマンティック バージョニングに従う必要があります。同じメジャー バージョンのマイナー バージョンには下位互換性があります。
  2. HEAD のルールは、最新の Bazel LTS リリースと互換性がある必要があります。
  3. HEAD のルールは、HEAD の Bazel と互換性がある必要があります。これを実現するには、次の手順を行います。
  4. ルールの最新のメジャー バージョンは、最新の Bazel LTS リリースと互換性がある必要があります。
  5. ルールの新しいメジャー バージョンは、ルールの以前のメジャー バージョンでサポートされている最後の Bazel LTS リリースと互換性がある必要があります。

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

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

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

一般に、推奨されるアプローチでは、ルールを Bazel と互換性のない変更を行い、HEAD で Bazel の新機能を活用します 最新の Bazel LTS リリースとの互換性の低下。