O sistema Bazel é implementado como um processo de servidor de longa duração. Isso permite que ele
faça 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
diferentes comandos, 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 na base de saída, que, por padrão, é determinada pelo caminho do diretório do espaço de trabalho base e pelo seu ID de usuário. 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 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 serão diferentes
(IDs de usuário diferentes).
Se o cliente não encontrar uma instância de servidor em execução, ele vai iniciar uma nova. Ele faz isso verificando se a base de saída já existe, o que implica que o arquivo blaze já foi descompactado. Caso contrário, se a base de saída não existir, o cliente vai descompactar os arquivos do arquivo e definir os mtime
s para uma data 9 anos no futuro. Depois de instalado, o cliente confirma que os mtime
s dos
arquivos descompactados são iguais à data distante para garantir que não houve 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 maior parte do tempo, 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 ociosos. Para isso, desligue-os explicitamente quando terminar de usá-los ou especifique
um período de tempo limite curto.
O nome de um processo do servidor 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=...
Assim, fica mais fácil descobrir a qual espaço de trabalho um determinado processo de servidor pertence. (Com outras opções para ps
, os processos do servidor do Bazel podem ser chamados apenas de java
.) Os servidores do Bazel podem ser interrompidos usando o comando shutdown.
Ao executar o bazel
, o cliente primeiro verifica se o servidor é a versão
adequada. Se não for, o servidor será interrompido e um novo será iniciado. Isso garante que o uso de um processo de servidor de longa duração não interfira no controle de versões adequado.