Compatibilidad de las reglas

Informar un problema Ver código fuente Nocturno · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Las reglas de Starlark de Bazel pueden romper la compatibilidad con las versiones de LTS de Bazel en los siguientes dos casos:

  1. La regla rompe la compatibilidad con futuras versiones de LTS porque se quitó de Bazel en HEAD una función de la que depende.
  2. La regla interrumpe la compatibilidad con las versiones de LTS actuales o anteriores porque una función de la que depende solo está disponible en las versiones de LTS de Bazel más recientes.

Mientras tanto, la regla en sí puede enviar cambios incompatibles para sus usuarios también. Cuando se combina con cambios rotundos en Bazel, actualizar la versión de la regla y la versión de Bazel a menudo puede ser una fuente de frustración para los usuarios de Bazel. En esta página, se explica cómo los autores de reglas deben mantener la compatibilidad de las reglas con Bazel para que los usuarios puedan actualizar Bazel y las reglas con mayor facilidad.

Proceso de migración administrable

Si bien es obvio que no es factible garantizar la compatibilidad entre cada versión de Bazel y cada versión de la regla, nuestro objetivo es asegurarnos de que el proceso de migración siga siendo manejable para los usuarios de Bazel. Un proceso de migración administrable se define como un proceso en el que los usuarios no se ven obligados a actualizar la versión principal de la regla y la versión principal de Bazel de forma simultánea, lo que permite a los usuarios controlar los cambios incompatibles de una fuente a la vez.

Por ejemplo, con la siguiente matriz de compatibilidad:

  • No se considera que la migración de rules_foo 1.x + Bazel 4.x a rules_foo 2.x + Bazel 5.x sea manejable, ya que los usuarios deben actualizar la versión principal de rules_foo y Bazel al mismo tiempo.
  • Se considera que la migración de rules_foo 2.x + Bazel 5.x a rules_foo 3.x + Bazel 6.x es manejable, ya que los usuarios pueden primero actualizar rules_foo de 2.x a 3.x sin cambiar la versión principal de Bazel y, luego, actualizar Bazel de 5.x a 6.x.
rules_foo 1.x rules_foo 2.x rules_foo 3.x CABEZA
Bazel 4.x
Bazel 5.x
Bazel 6.x
CABEZA

❌: No hay ninguna versión de la versión principal de la regla que sea compatible con la versión de LTS de Bazel.

✅: Al menos una versión de la regla es compatible con la versión más reciente de la versión de LTS de Bazel.

Prácticas recomendadas

Como autores de reglas de Bazel, pueden garantizar un proceso de migración manejable para los usuarios si siguen estas prácticas recomendadas:

  1. La regla debe seguir el control de versiones semántico: las versiones secundarias de la misma versión principal son retrocompatibles.
  2. La regla en HEAD debe ser compatible con la versión LTS más reciente de Bazel.
  3. La regla en HEAD debe ser compatible con Bazel en HEAD. Para lograrlo, puedes hacer lo siguiente:
  4. La versión principal más reciente de la regla debe ser compatible con la versión LTS más reciente de Bazel.
  5. Una nueva versión principal de la regla debe ser compatible con la última versión LTS de Bazel admitida por la versión principal anterior de la regla.

Lograr los puntos 2 y 3 es la tarea más importante, ya que permite alcanzar los puntos 4 y 5. naturalmente.

Para facilitar la compatibilidad con Bazel en HEAD y la versión LTS más reciente de Bazel, los autores de reglas pueden hacer lo siguiente:

  • Solicita que las funciones compatibles con versiones anteriores se porten a la versión de LTS más reciente. Consulta el proceso de lanzamiento para obtener más detalles.
  • Usa bazel_features para detectar funciones de Bazel.

En general, con los enfoques recomendados, las reglas deberían poder migrarse para los cambios incompatibles con Bazel y aprovechar las nuevas funciones de Bazel en HEAD sin perder la compatibilidad con la versión LTS más reciente de Bazel.