Bazel Starlark ルールが原因で、Bazel LTS リリースとの互換性が 次の 2 つのシナリオがあります
- このルールにより、今後の LTS リリースとの互換性が損なわれます。これは、 が HEAD で Bazel から削除されました。
- このルールにより、現行または古い LTS リリースとの互換性が失われます。 依存する機能が新しい Bazel 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 と互換性がある必要があります。そのために
できます。
- HEAD で Bazel を使用して独自の CI テストを設定する
- プロジェクトを Bazel ダウンストリームに追加する testing; Bazel で変更が破損した場合に、Bazel チームはプロジェクトに問題を報告します プロジェクトに影響するため、Google のダウンストリーム プロジェクト ポリシー 迅速に問題に対処できます
- ルールの最新のメジャー バージョンは、最新のバージョンと互換性がある Bazel LTS リリース。
- ルールの新しいメジャー バージョンは、最後の Bazel LTS と互換性がある必要があります 以前のメジャー バージョンでサポートされていたリリースを指します。
2. および 3. を達成することが最も重要なタスクです。これは 4. および 3. を達成できるからです。 5.生成できます。
HEAD の Bazel と最新バージョンの両方との互換性を簡単に維持できるように Bazel LTS リリースの場合、ルール作成者は次のことができます。
- 下位互換性のある機能を最新の LTS にバックポートするようリクエストする リリースについては、リリース プロセスをご確認ください。 をご覧ください。
- bazel_features を使用する Bazel の機能検出を行います。
一般的に、推奨されているアプローチでは、 Bazel と互換性のない変更を行い、HEAD で Bazel の新機能を活用します 最新の Bazel LTS リリースとの互換性の低下。