ルールの互換性

問題を報告 ソースを表示

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

  1. このルールは、依存する機能が HEAD の Bazel から削除されるため、今後の LTS リリースとの互換性が失われます。
  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 への移行は管理しやすくなります。ユーザーは、まず、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_features を使用して、Bazel 機能検出を行います。

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