Esta página descreve como estender a linguagem BUILD usando macros e regras de código.
As extensões do Bazel são arquivos que terminam em .bzl
. Use um
instrução de carregamento para importar um símbolo de uma extensão.
Antes de aprender os conceitos mais avançados, faça o seguinte:
Leia sobre a linguagem Starlark, usada nas Arquivos
BUILD
e.bzl
.Saiba como compartilhar variáveis. entre dois arquivos
BUILD
.
Macros e regras
Uma macro é uma função que instancia regras. Ele é útil quando um
O arquivo BUILD
está ficando muito repetitivo ou complexo demais, porque permite a reutilização
código. A função é avaliada assim que o arquivo BUILD
é lido. Depois
a avaliação do arquivo BUILD
, o Bazel tem poucas informações sobre macros:
Se a macro gerar uma genrule
, o Bazel vai se comportar como se você tivesse gravado a
genrule
. Como resultado, bazel query
listará apenas o genrule
gerado.
Uma regra é mais eficiente do que uma macro. Ele pode acessar o Bazel e ter controle total sobre o que está acontecendo. Ela pode, por exemplo, transmitir informações a outras regras.
Se você quiser reutilizar a lógica simples, comece com uma macro. Se uma macro se tornar complexo, é uma boa ideia transformá-lo em uma regra. Suporte para um novo idioma geralmente é feito com uma regra. As regras são para usuários avançados e a maioria os usuários nunca terão que escrever um; elas só vão carregar e chamar regras de firewall.
Modelo de avaliação
Um build consiste em três fases.
Fase de carregamento. Primeiro, carregue e avalie todas as extensões e todos os
BUILD
os arquivos necessários para o build. A execução dos arquivosBUILD
simplesmente instancia regras (sempre que uma regra é chamada, ela é adicionada a um gráfico). É aqui que as macros são avaliadas.Fase de análise. O código das regras é executado (o
implementation
delas) ) e ações são instanciadas. Uma ação descreve como gerar um conjunto de saídas de um conjunto de entradas, como "executar gcc em hello.c e obter hello.o". É necessário listar explicitamente quais arquivos serão gerados antes e executar os comandos reais. Em outras palavras, a fase de análise leva o gráfico gerado pela fase de carregamento e gera um gráfico de ações.Fase de execução: As ações são executadas quando pelo menos uma das saídas é obrigatórios. Se faltar um arquivo ou se um comando não gerar uma resposta, o build vai falhar. Os testes também são executados durante essa fase.
O Bazel usa o paralelismo para ler, analisar e avaliar os arquivos .bzl
e BUILD
.
. Um arquivo é lido no máximo uma vez por build e o resultado da avaliação é
armazenados em cache e reutilizados. Um arquivo é avaliado apenas quando todas as dependências correspondentes (load()
) foram resolvidas. Por padrão, carregar um arquivo .bzl
não tem elementos
ela só define valores e funções.
O Bazel tenta ser inteligente: usa a análise de dependências para saber quais arquivos precisam carregado, quais regras devem ser analisadas e quais ações devem ser executadas. Para Por exemplo, se uma regra gerar ações desnecessárias para o build atual, elas não serão executadas.
Criar extensões
Crie sua primeira macro para reutilizar algum código. Em seguida, saiba mais sobre macros e usando-os para criar "verbos personalizados".
Siga o tutorial de regras para começar a usá-las. A seguir, leia mais sobre os conceitos de regras.
Os dois links abaixo serão muito úteis para criar suas próprias extensões. Manter ao alcance deles:
Indo mais longe
Além de macros e regras, você pode escrever aspects e regras de repositório.
Usar o Buildifier de forma consistente para formatar e inspecionar o código.
Siga o guia de estilo do
.bzl
.Teste o código.
Gere documentação para ajudar seus usuários.
Otimize o desempenho do seu código.
Implante suas extensões para outras pessoas.