Archivo de bloqueo de Bazel

Informar un problema Ver fuente . Por la noche · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

La función de archivo de bloqueo en Bazel permite grabar versiones específicas o dependencias de bibliotecas de software o paquetes requeridos por un proyecto. Integra lo logra almacenando el resultado de la resolución y extensión del módulo la evaluación del rendimiento. El archivo de bloqueo promueve compilaciones reproducibles, lo que garantiza entornos de desarrollo de aplicaciones. Además, mejora la eficiencia de la compilación, ya que permite Bazel omita el proceso de resolución cuando no haya cambios en el proyecto. dependencias. Además, el archivo de bloqueo mejora la estabilidad evitando actualizaciones inesperadas o cambios rotundos en bibliotecas externas, lo que reduce el riesgo de introducir errores.

Generación de archivos de bloqueo

El archivo de bloqueo se genera en la raíz del lugar de trabajo con el nombre. MODULE.bazel.lock Se crea o actualiza durante el proceso de compilación. específicamente, después de la resolución del módulo y la evaluación de la extensión. El archivo de bloqueo captura el estado actual del proyecto, incluidos el archivo MÓDULO, las marcas, anulaciones y otra información relevante. Es importante destacar que solo incluye las dependencias que se incluyen en la invocación actual de la compilación.

Cuando se producen cambios en el proyecto que afectan sus dependencias, el archivo de bloqueo se automáticamente para reflejar el nuevo estado. Esto garantiza que el bloqueo del archivo se mantiene enfocado en el conjunto específico de dependencias necesarias para la crear, lo que brinda una representación precisa de la resolución dependencias.

Uso del archivo de bloqueo

El bloqueo se puede controlar con el parámetro --lockfile_mode a personalizar el comportamiento de Bazel cuando el estado del proyecto sea diferente del Archivo de bloqueo. Los modos disponibles son los siguientes:

  • update (predeterminado): Si el estado del proyecto coincide con el archivo de bloqueo, el del resultado de la resolución se muestra inmediatamente desde el archivo de bloqueo. De lo contrario, se ejecuta la resolución y el archivo de bloqueo se actualiza para reflejar el para cada estado.
  • error: Si el estado del proyecto coincide con el archivo de bloqueo, el resultado de la resolución es que muestra el archivo de bloqueo. De lo contrario, Bazel arroja un error que indica la variaciones entre el proyecto y el archivo de bloqueo. Este modo es particularmente relevante útil cuando quieres asegurarte de que las dependencias de tu proyecto permanezcan sin cambios, y las diferencias se tratan como errores.
  • off: El archivo de bloqueo no está verificado.

Beneficios del archivo de bloqueo

El archivo de bloqueo ofrece varios beneficios y se puede usar de varias maneras:

  • Compilaciones reproducibles. Capturando las versiones o dependencias específicas de las bibliotecas de software, el archivo de bloqueo garantiza que las compilaciones en diferentes entornos y a lo largo del tiempo. Los desarrolladores pueden confiar en resultados coherentes y predecibles cuando crean sus proyectos.

  • Omisión eficiente de la resolución El archivo de bloqueo le permite a Bazel omitir la proceso de resolución de problemas si no hay cambios en las dependencias del proyecto, ya que la última compilación. Esto mejora significativamente la eficiencia de la compilación, especialmente en en los que la resolución puede llevar mucho tiempo.

  • Estabilidad y reducción de riesgos. El archivo de bloqueo ayuda a mantener la estabilidad lo que evita actualizaciones inesperadas o cambios rotundos en las bibliotecas externas. De bloquear dependencias en versiones específicas, el riesgo de introducir errores debido a actualizaciones incompatibles o no probadas.

Contenido del archivo de bloqueo

El archivo de bloqueo contiene toda la información necesaria para determinar si el estado del proyecto cambió. También incluye el resultado de construir el proyecto en el estado actual. El archivo de bloqueo consta de dos partes principales:

  1. Las entradas de la resolución del módulo, como moduleFileHash, flags y localOverrideHashes, así como el resultado de la resolución, que es moduleDepGraph
  2. Para cada extensión de módulo, el archivo de bloqueo incluye entradas que lo afectan, representado por transitiveDigest, y el resultado de ejecutar esa extensión denominado generatedRepoSpecs

Este es un ejemplo que demuestra la estructura del archivo de bloqueo, junto con explicaciones para cada sección:

{
  "lockFileVersion": 1,
  "moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
  "flags": {
    "cmdRegistries": [
      "https://bcr.bazel.build/"
    ],
    "cmdModuleOverrides": {},
    "allowedYankedVersions": [],
    "envVarAllowedYankedVersions": "",
    "ignoreDevDependency": false,
    "directDependenciesMode": "WARNING",
    "compatibilityMode": "ERROR"
  },
  "localOverrideHashes": {
    "bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
  },
  "moduleDepGraph": {
    "<root>": {
      "name": "",
      "version": "",
      "executionPlatformsToRegister": [],
      "toolchainsToRegister": [],
      "extensionUsages": [
        {
          "extensionBzlFile": "extension.bzl",
          "extensionName": "lockfile_ext"
        }
      ],
      ...
    }
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
      "generatedRepoSpecs": {
        "hello": {
          "bzlFile": "@@//:extension.bzl",
          ...
        }
      }
    }
  }
}

Hash de archivo de módulo

El moduleFileHash representa el hash del contenido del archivo MODULE.bazel. Si se produce algún cambio en este archivo, el valor de hash difiere.

Marcas

El objeto Flags almacena todas las marcas que pueden afectar el resultado de la resolución.

Hashes de anulación locales

Si el módulo raíz incluye local_path_overrides, esta sección almacena el hash del archivo MODULE.bazel en el repositorio local. Permite hacer un seguimiento de los cambios a esta dependencia.

Grafo de dependencia del módulo

El elemento moduleDepGraph representa el resultado del proceso de resolución mediante el elemento que se mencionaron anteriormente. Forma el gráfico de dependencias de todos los módulos necesarias para ejecutar el proyecto.

Extensiones de módulo

La sección moduleExtensions es un mapa que incluye solo las extensiones utilizadas en la invocación actual o anteriormente, y se excluyen las extensiones que ya no se utilizan. En otras palabras, si una extensión no se está usando ya no está en el gráfico de dependencia, se quita de moduleExtensions. mapa.

Cada entrada en este mapa corresponde a una extensión utilizada y se identifica por su que contiene el archivo y el nombre. El valor correspondiente para cada entrada contiene los información relevante asociada con esa extensión:

  1. El transitiveDigest: el resumen de la implementación de la extensión y su archivos .bzl transitivos.
  2. El generatedRepoSpecs es el resultado de ejecutar esa extensión con el entrada actual.

Un factor adicional que puede afectar los resultados de la extensión son sus usos. Aunque no se almacenan en el archivo de bloqueo, los usos se consideran cuando se comparan el estado actual de la extensión con el del archivo de bloqueo.

Prácticas recomendadas

Para maximizar los beneficios de la función de archivo bloqueado, considera lo siguiente prácticas:

  • Actualiza regularmente el archivo de bloqueo para reflejar los cambios en las dependencias del proyecto o configuración. Esto garantiza que las compilaciones posteriores se basen en la información un conjunto de dependencias preciso y actualizado.

  • Incluye el bloqueo de versión en el control de versión para facilitar la colaboración y garantizar que todos los miembros del equipo tengan acceso al mismo archivo de bloqueo, lo que promueve entornos de desarrollo coherentes en todo el proyecto.

Si sigues estas prácticas recomendadas, podrás usar el archivo bloqueado en Bazel para que sea más eficiente, confiable y en los flujos de trabajo de desarrollo de software.