Implementación del cliente o servidor

Informar un problema Ver fuente

El sistema Bazel se implementa como un proceso de servidor de larga duración. Esto le permite realizar muchas optimizaciones que no son posibles con una implementación orientada por lotes, como el almacenamiento en caché de archivos BUILD, gráficos de dependencias y otros metadatos de una compilación a la siguiente. Esto mejora la velocidad de las compilaciones incrementales y permite que diferentes comandos, como build y query, compartan la misma caché de paquetes cargados, lo que hace que las consultas sean muy rápidas. Cada servidor puede controlar como máximo una invocación a la vez; las demás invocaciones simultáneas se bloquearán o fallarán rápidamente (consulta --block_for_lock).

Cuando ejecutas bazel, ejecutas el cliente. El cliente encuentra el servidor en función de la base de salida, que se determina de forma predeterminada por la ruta de acceso del directorio del lugar de trabajo base y tu ID de usuario, por lo que si compilas en varios lugares de trabajo, tendrás varias bases de salida y, por lo tanto, varios procesos del servidor de Bazel. Varios usuarios en la misma estación de trabajo pueden compilar de forma simultánea en el mismo lugar de trabajo porque sus bases de salida serán diferentes (diferentes ID de usuario).

Si el cliente no puede encontrar una instancia de servidor en ejecución, inicia una nueva. Para ello, verifica si la base de salida ya existe, lo que implica que el archivo blaze ya se desempaqueta. De lo contrario, si la base de salida no existe, el cliente descomprime los archivos del archivo y establece sus mtime en una fecha de 9 años en el futuro. Una vez instalado, el cliente confirma que los mtime de los archivos descomprimidos son iguales a la fecha lejana para asegurarse de que no se haya producido ninguna alteración en la instalación.

El proceso del servidor se detendrá después de un período de inactividad (3 horas, de forma predeterminada, que se pueden modificar con la opción de inicio --max_idle_secs). En general, el hecho de que haya un servidor en ejecución es invisible para el usuario, pero a veces resulta útil tener esto en cuenta. Por ejemplo, si ejecutas secuencias de comandos que realizan muchas compilaciones automatizadas en directorios diferentes, es importante que te asegures de no acumular muchos servidores inactivos. Para ello, ciérralos de manera explícita cuando termines de usarlos o especifica un tiempo de espera corto.

El nombre de un proceso del servidor de Bazel aparece en el resultado de ps x o ps -e f como bazel(dirname), en el que dirname es el nombre base del directorio que contiene la raíz del directorio de tu lugar de trabajo. Por ejemplo:

ps -e f
16143 ?        Sl     3:00 bazel(src-johndoe2) -server -Djava.library.path=...

Esto facilita la identificación del proceso del servidor que pertenece a un lugar de trabajo determinado. (Ten en cuenta que, con otras opciones de ps, los procesos del servidor de Bazel pueden llamarse solo java). Los servidores de Bazel se pueden detener con el comando de apagado.

Cuando ejecuta bazel, el cliente primero comprueba que el servidor tenga la versión adecuada. De lo contrario, se detiene el servidor y se inicia uno nuevo. Esto garantiza que el uso de un proceso de servidor de larga duración no interfiera en el control de versiones adecuado.