El sistema de 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 a lotes, como el almacenamiento en caché de archivos BUILD, gráficos de dependencia 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 invocaciones simultáneas adicionales se bloquearán o fallarán rápidamente (consulta --block_for_lock
).
Cuando ejecutas bazel
, estás ejecutando el cliente. El cliente encuentra el servidor según la base de salida, que, de forma predeterminada, se determina según la ruta de acceso del directorio del espacio de trabajo base y tu ID de usuario. Por lo tanto, si compilas en varios espacios 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 espacio de trabajo porque sus bases de salida serán diferentes (diferentes IDs de usuario).
Si el cliente no puede encontrar una instancia del servidor en ejecución, inicia una nueva. Para ello, verifica si la base de salida ya existe, lo que implica que el archivo de Blaze ya se descomprimió. De lo contrario, si la base de salida no existe, el cliente descomprime los archivos del archivo y establece sus mtime
s en una fecha 9 años en el futuro. Una vez instalado, el cliente confirma que el mtime
de los archivos descomprimidos es igual a la fecha lejana para garantizar que no se haya manipulado 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 su mayor parte, el hecho de que haya un servidor en ejecución es invisible para el usuario, pero a veces es útil tenerlo en cuenta. Por ejemplo, si ejecutas secuencias de comandos que realizan muchas compilaciones automatizadas en diferentes directorios, es importante asegurarte de no acumular muchos servidores inactivos. Para ello, puedes apagarlos de forma explícita cuando termines de usarlos o especificar un período 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 encierra la raíz del directorio de tu espacio 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 espacio de trabajo determinado. (Ten en cuenta que, con otras opciones para ps
, los procesos del servidor de Bazel pueden llamarse simplemente java
). Los servidores de Bazel se pueden detener con el comando shutdown.
Cuando se ejecuta bazel
, el cliente primero verifica 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 con el control de versiones adecuado.