Implementação do cliente/servidor

O sistema Bazel é implementado como um processo de servidor de longa duração. Isso permite que ele execute muitas otimizações possíveis com uma implementação orientada a lotes, como armazenamento em cache de arquivos BUILD, gráficos de dependência e outros metadados de uma versão para outra. Isso aumenta a velocidade de builds incrementais e permite que diferentes comandos, como build e query, compartilhem o mesmo cache de pacotes carregados, tornando as consultas muito rápidas.

Ao executar bazel, você está executando o cliente. O cliente encontra o servidor com base na base de saída, que, por padrão, é determinada pelo caminho do diretório de espaço de trabalho base e seu userid. Portanto, se você criar em vários espaços de trabalho, terá várias bases de saída e, portanto, vários processos do servidor do Bazel. Vários usuários na mesma estação de trabalho podem criar simultaneamente no mesmo espaço de trabalho porque as bases de saída são diferentes (diferentes IDs de usuário). Se o cliente não encontrar uma instância do servidor em execução, ele iniciará uma nova instância. O processo do servidor será interrompido após um período de inatividade (por padrão, três horas, que pode ser modificado usando a opção de inicialização --max_idle_secs).

Na maioria dos casos, o fato de haver um servidor em execução é invisível para o usuário, mas às vezes isso é útil. Por exemplo, se você estiver executando scripts que executem muitos builds automatizados em diretórios diferentes, é importante garantir que você não acumule muitos servidores inativos. Para isso, desligue-os explicitamente quando terminar ou especifique um curto período de tempo limite para fazer isso.

O nome de um processo do servidor do Bazel aparece na saída de ps x ou ps -e f como bazel(dirname), em que dirname é o nome base do diretório que abrange a raiz do diretório do espaço de trabalho. Exemplo:

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

Isso facilita descobrir qual processo do servidor pertence a um determinado espaço de trabalho. Com algumas outras opções para ps, os processos do servidor do Bazel podem ser nomeados apenas como java. Os servidores do Bazel podem ser interrompidos usando o comando shutdown.

Ao executar bazel, o cliente verifica primeiro se o servidor é a versão apropriada. Se não é, o servidor é interrompido e um novo é iniciado. Isso garante que o uso de um processo de servidor de longa duração não interfira no controle adequado do controle de versão.