Implementación del cliente o servidor

El sistema Bazel se implementa como un proceso de servidor de larga duración. Esto permite realizar muchas optimizaciones no posibles con una implementación orientada a 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.

Cuando ejecutas bazel, se ejecuta el cliente. El cliente encuentra el servidor en función de la base de salida, que, de forma predeterminada, se determina según la ruta del directorio del lugar de trabajo base y el 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 de servidor de Bazel. Varios usuarios en la misma estación de trabajo pueden compilar simultáneamente en el mismo lugar de trabajo porque sus bases de salida diferirán (diferentes ID de usuario). Si el cliente no puede encontrar una instancia de servidor en ejecución, inicia una nueva. El proceso del servidor se detendrá después de un período de inactividad (3 horas, de forma predeterminada, que se puede modificar mediante 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 ayuda con esto en mente. Por ejemplo, si ejecutas secuencias de comandos que realizan muchas compilaciones automatizadas en diferentes directorios, es importante que te asegures de no acumular muchos servidores inactivos. Para ello, ciérralos explícitamente cuando termines con ellos o especifica un período de 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), donde 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 averiguar qué proceso del servidor pertenece a un lugar de trabajo determinado. Ten en cuenta que, con otras opciones para ps, los procesos del servidor de Bazel pueden llamarse solo java. Los servidores de Bazel se pueden detener con el comando shutdown.

Cuando se ejecuta bazel, el cliente primero verifica que el servidor sea la versión correcta. De lo contrario, el servidor se detiene 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.