규칙 호환성

Bazel Starlark 규칙은 다음 두 가지 시나리오에서 Bazel LTS 출시 버전과의 호환성을 손상시킬 수 있습니다.

  1. 규칙이 의존하는 기능이 HEAD에서 Bazel에서 삭제되므로 규칙이 향후 LTS 출시 버전과의 호환성을 손상시킵니다.
  2. 규칙이 의존하는 기능이 최신 Bazel LTS 출시 버전에서만 제공되므로 규칙이 현재 또는 이전 LTS 출시 버전과의 호환성을 손상시킵니다.

한편 규칙 자체도 사용자에게 호환되지 않는 변경사항을 제공할 수 있습니다. Bazel의 호환성을 손상시키는 변경사항과 결합하면 규칙 버전과 Bazel 버전을 업그레이드하는 것이 Bazel 사용자에게 좌절감을 안겨줄 수 있습니다. 이 페이지에서는 규칙 작성자가 Bazel과의 규칙 호환성을 유지하여 사용자가 Bazel과 규칙을 더 쉽게 업그레이드할 수 있도록 하는 방법을 설명합니다.

관리 가능한 이전 프로세스

모든 버전의 Bazel과 모든 버전의 규칙 간에 호환성을 보장하는 것은 분명히 불가능하지만 Google의 목표는 Bazel 사용자가 이전 프로세스를 관리할 수 있도록 하는 것입니다. 관리 가능한 이전 프로세스는 사용자가 규칙의 메이저 버전과 Bazel의 메이저 버전을 동시에 업그레이드하지 않아도 되는 프로세스로 정의되며, 이를 통해 사용자는 한 번에 하나의 소스에서 호환되지 않는 변경사항을 처리할 수 있습니다.

예를 들어 다음 호환성 매트릭스를 사용합니다.

  • 사용자가 rules_foo 및 Bazel의 메이저 버전을 동시에 업그레이드해야 하므로 rules_foo 1.x + Bazel 4.x에서 rules_foo 2.x + Bazel 5.x로 이전하는 것은 관리 가능한 것으로 간주되지 않습니다.
  • 사용자가 메이저 Bazel 버전을 변경하지 않고 먼저 rules_foo를 2.x에서 3.x로 업그레이드한 다음 Bazel을 5.x에서 6.x로 업그레이드할 수 있으므로 rules_foo 2.x + Bazel 5.x에서 rules_foo 3.x + Bazel 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 출시 버전과 호환되지 않습니다.

✅: 규칙의 버전이 하나 이상 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 기능을 사용할 수 있어야 합니다.