Bazel Starlark ルールが原因で、Bazel LTS リリースとの互換性が 次の 2 つのシナリオがあります
- このルールは、依存する機能が HEAD の Bazel から削除されているため、今後の LTS リリースとの互換性を破ります。
- このルールは、依存する機能が新しい 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 ルールの作成者は、次のベスト プラクティスに従うことで、ユーザーにとって管理可能な移行プロセスを確保できます。
- ルールは、Semantic バージョニング: 同じサービスのマイナー バージョン 下位互換性があります。
- HEAD のルールは、最新の Bazel LTS リリースと互換性がある必要があります。
- HEAD のルールは、HEAD の Bazel と互換性がある必要があります。これを実現するには、次の手順を行います。
- Bazel で HEAD で独自の CI テストを設定する
- プロジェクトを Bazel ダウンストリーム テストに追加します。Bazel の破壊的変更がプロジェクトに影響する場合、Bazel チームはプロジェクトに問題を報告します。問題にタイムリーに対応するには、ダウンストリーム プロジェクト ポリシーに準拠する必要があります。
- ルールの最新のメジャー バージョンは、最新の Bazel LTS リリースと互換性がある必要があります。
- ルールの新しいメジャー バージョンは、最後の Bazel LTS と互換性がある必要があります 以前のメジャー バージョンでサポートされていたリリースを指します。
2. および 3. を達成することが最も重要なタスクであり、4. および 3. を達成することが 5.生成できます。
HEAD の Bazel と最新バージョンの両方との互換性を簡単に維持できるように Bazel LTS リリースの場合、ルール作成者は次のことができます。
- 下位互換性のある機能を最新の LTS にバックポートするようリクエストする リリースについては、リリース プロセスをご確認ください。 をご覧ください。
- bazel_features を使用する Bazel の機能検出を行います。
一般に、推奨されるアプローチでは、最新の Bazel LTS リリースとの互換性を失うことなく、Bazel との互換性のない変更に対してルールを移行し、HEAD で新しい Bazel 機能を使用できます。