Visão geral da extensão

Informar um problema Mostrar fonte Por noite · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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:

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 arquivos BUILD 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

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.