O sistema do Bazel é implementado como um processo de servidor de longa duração. Isso permite que ele
execute muitas otimizações que não são possíveis com uma implementação orientada a lotes,
como o armazenamento em cache de arquivos BUILD, gráficos de dependência e outros metadados de um
build para o próximo. Isso melhora a velocidade dos builds incrementais e permite que
comandos diferentes, como build e query, compartilhem o mesmo cache de
pacotes carregados, tornando as consultas muito rápidas. Cada servidor pode processar no máximo uma
invocação por vez. Outras invocações simultâneas serão bloqueadas ou
falharão rapidamente (consulte --block_for_lock).
Ao executar bazel, você está executando o cliente. O cliente encontra o servidor
com base no diretório de saída, que, por padrão, é
determinado pelo caminho do diretório do espaço de trabalho base e pelo ID do usuário. Portanto, se
você criar em vários espaços de trabalho, terá vários diretórios de saída e, consequentemente,
vários processos de servidor do Bazel. Vários usuários na mesma estação de trabalho podem
criar simultaneamente no mesmo espaço de trabalho porque os diretórios de saída serão diferentes
(IDs de usuário diferentes).
Se o cliente não encontrar uma instância de servidor em execução, ele iniciará uma nova. Para isso, ele
verifica se o diretório de saída já existe, o que implica que o arquivo do Blaze
já foi descompactado. Caso contrário, se o diretório de saída não existir,
o cliente descompactará os arquivos do arquivo e definirá os mtimes para uma data 9 anos
no futuro. Depois de instalado, o cliente confirma se os mtimes dos
arquivos descompactados são iguais à data distante para garantir que não tenha ocorrido adulteração da instalação.
O processo do servidor será interrompido após um período de inatividade (3 horas, por padrão,
que pode ser modificado usando a opção de inicialização --max_idle_secs). Na maioria das
vezes, o fato de haver um servidor em execução é invisível para o usuário, mas
às vezes é útil ter isso em mente. Por exemplo, se você estiver executando scripts
que realizam muitos builds automatizados em diretórios diferentes, é importante
garantir que você não acumule muitos servidores inativos. Para isso, encerre-os explicitamente quando terminar de usá-los ou especifique
um período de tempo limite curto.
O nome de um processo de 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 envolve 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 a descoberta de qual processo de servidor pertence a um determinado
espaço de trabalho. Com outras opções para ps, os processos de servidor do Bazel
podem ser nomeados apenas como java. Os servidores do Bazel podem ser interrompidos usando o
comando de encerramento.
Ao executar bazel, o cliente primeiro verifica se o servidor é a versão apropriada
. Caso contrário, 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 de versões adequado.