O sistema Bazel é implementado como um processo de servidor de longa duração. Isso permite
realizar muitas otimizações que não são possíveis com uma implementação orientada em lote,
como 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 de builds incrementais e permite
que comandos diferentes, como build
e query
, compartilhem o mesmo cache de
pacotes carregados, agilizando as consultas. Cada servidor pode processar no máximo uma
invocação por vez. Outras invocações simultâneas serão bloqueadas ou
facilitarem a execução (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 base do espaço de trabalho e pelo seu userid. Portanto, se
você compilar em vários espaços de trabalho, terá várias bases de saída e, portanto,
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 as bases de saída deles são diferentes (userids diferentes).
Se o cliente não consegue encontrar uma instância de servidor em execução, ele inicia uma nova. Isso
é feito verificando se a base de saída já existe, indicando que o arquivo
blaze já foi descompactado. Caso contrário, se a base de saída não existir, o cliente descompactará os arquivos e definirá os mtime
s deles como uma data futura de nove anos. Depois de instalado, o cliente confirma se os mtime
s dos
arquivos descompactados são iguais à data remota para garantir que não haja adulteração da
instalação.
O processo do servidor será interrompido após um período de inatividade (três horas, por padrão,
o que pode ser modificado usando a opção de inicialização --max_idle_secs
). Na maioria
das partes, o fato de haver um servidor em execução não é visível para o usuário, mas
às vezes é útil ter isso em mente. Por exemplo, se você estiver executando scripts
que executam muitos builds automatizados em diretórios diferentes, é importante
garantir que não haja muitos servidores inativos. É possível fazer isso
desligando-os explicitamente quando não precisar mais deles ou especificando
um curto período de tempo limite.
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 contém 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 identificação de qual processo do servidor pertence a um determinado
espaço de trabalho. Esteja ciente de que, 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 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.