Nesta página, descrevemos como otimizar o desempenho de build do Bazel ao executar o Bazel. repetidamente.
Estado do ambiente de execução do Bazel
Uma invocação do Bazel envolve várias partes que interagem.
A interface de linha de comando (CLI)
bazel
é a ferramenta de front-end voltada para o usuário e recebe comandos do usuário.A ferramenta da CLI inicia um servidor Bazel para cada base de saída distinta. Em geral, o servidor do Bazel é permanente, mas é encerrado após uma inatividade tempo para não desperdiçar recursos.
O servidor do Bazel executa as etapas de carregamento e análise de um determinado comando. (
build
,run
,cquery
etc.), em que constrói as partes necessárias do gráfico de build na memória. As estruturas de dados resultantes são mantidas o servidor do Bazel como parte do cache de análise.O servidor do Bazel também pode executar a ação ou enviar desativadas para execução remota se estiver configurado para isso. Os resultados de execuções de ação também são armazenadas em cache, ou seja, no cache de ações cache de execução, que pode ser local ou remoto e pode ser compartilhado entre os servidores do Bazel).
O resultado da invocação do Bazel é disponibilizado na árvore de saída.
Como executar o Bazel iterativamente
Em um fluxo de trabalho típico de desenvolvedor, é comum criar (ou executar) um código
repetidamente, muitas vezes com uma frequência muito alta (por exemplo, para resolver alguma compilação
ou investigar um teste com falha). Nessa situação, é importante que
invocações repetidas de bazel
têm a menor sobrecarga possível em relação
a ação repetida e subjacente (por exemplo, invocar um compilador ou executar um teste).
Pensando nisso, vamos dar outra olhada no estado do ambiente de execução do Bazel:
O cache de análise é uma parte essencial dos dados. Um tempo significativo pode ser gasto apenas nas fases de carregamento e análise de uma execução a frio (ou seja, uma execução apenas após o início do servidor do Bazel ou quando o cache de análise foi descartado). Para um único build frio bem-sucedido (por exemplo, para uma versão de produção), esse custo é de mas para construir repetidamente o mesmo alvo, é importante que isso que o custo seja amortizado e não repetido a cada invocação.
O cache de análise é bastante volátil. Primeiro, ela faz parte do processo
o estado atual do servidor do Bazel. Assim, se o servidor for perdido, o cache será perdido. Mas o cache
também são invalidadas com muita facilidade: por exemplo, muitas flags de linha de comando bazel
fará com que o cache seja descartado. Isso ocorre porque muitas flags afetam o build
gráfico (por exemplo, devido aos
atributos configuráveis). Alguma sinalização
alterações também podem fazer com que o servidor Bazel seja reiniciado (por exemplo, alterar
opções de inicialização).
Um bom cache de execução também é valioso para o desempenho do build. Uma execução o cache pode ser mantido localmente em disco remotamente. O cache pode ser compartilhado entre servidores do Bazel e também entre desenvolvedores.
Evitar descartar o cache de análise
O Bazel vai mostrar um aviso se o cache de análise tiver sido descartado ou a servidor foi reiniciado. Evite o seguinte durante o uso iterativo:
Lembre-se de mudar as flags
bazel
no meio de uma iteração iterativa. de desenvolvimento de software. Por exemplo, misturar umabazel build -c opt
com umabazel cquery
faz com que cada comando descarte o cache de análise do outro. Em geral, use um conjunto fixo de sinalizações durante um fluxo de trabalho específico.Se você perder o servidor do Bazel, o cache de análise será perdido. O servidor do Bazel tem configurável ocioso tempo e, depois disso, é desligado. Você pode configurar dessa vez usando seu bazelrc para atender às suas necessidades. O servidor também é reiniciado quando as sinalizações mudarem, então evite alterá-las, se possível.
Cuidado: o servidor Bazel será eliminado se você pressionar Pressione Ctrl + C repetidamente enquanto o Bazel está em execução. É tentador tentar poupar tempo interrompendo uma compilação em execução que não é mais necessária, mas aperte apenas Pressione Ctrl+C uma vez para solicitar o término sem dificuldades da invocação atual.
Se você quiser usar vários conjuntos de sinalizações do mesmo espaço de trabalho, usam várias bases de saída distintas, alternadas com
--output_base
; . Cada base de saída recebe um servidor Bazel próprio.