Estes são alguns problemas comuns e perguntas sobre a criação de extensões.
Por que meu arquivo não é produzido / minha ação nunca é executada?
Ele só executa as ações necessárias para produzir os arquivos de saída solicitados.
Se o arquivo que você quer tiver um marcador, é possível solicitá-lo diretamente:
bazel build //pkg:myfile.txt
Se o arquivo estiver em um grupo de saída do destino, talvez seja necessário especificar esse grupo na linha de comando:
bazel build //pkg:mytarget --output_groups=foo
Se você quiser que o arquivo seja criado automaticamente sempre que seu destino for mencionado na linha de comando, adicione-o às saídas padrão da regra retornando um provedor
DefaultInfo
.
Consulte a página Regras para mais informações.
Por que minha função de implementação não é executada?
Ele analisa apenas os destinos solicitados para a compilação. Nomeie o destino na linha de comando ou escolha algo que dependa dele.
Falta um arquivo quando minha ação ou binário é executado
Verifique se 1) o arquivo foi registrado como uma entrada para a ação ou binário e 2) o script ou a ferramenta em execução está acessando o arquivo usando o caminho correto.
Para ações, declare entradas passando-as para a função ctx.actions.*
que cria a ação. Encontre o caminho adequado para o arquivo usando
File.path
.
Para binários (as saídas executáveis executadas por um comando bazel run
ou bazel test
), declare as entradas incluindo-as nos
runfiles. Em vez de usar o campo path
, use
File.short_path
, que é o caminho do arquivo relativo
ao diretório dos arquivos de execução em que o binário é executado.
Como posso controlar quais arquivos são criados pelo bazel build //pkg:mytarget
?
Use o provedor DefaultInfo
para
definir as saídas padrão.
Como posso executar um programa ou enviar E/S como parte do build?
Uma ferramenta pode ser declarada como um destino, assim como qualquer outra parte do seu build, e
executada durante a fase de execução para ajudar a criar outros destinos. Para criar uma ação
que execute uma ferramenta, use ctx.actions.run
e transmita a
ferramenta como o parâmetro executable
.
Durante as fases de carregamento e análise, uma ferramenta não pode ser executada, nem executar E/S de arquivos. Isso significa que as ferramentas e o conteúdo do arquivo (exceto o conteúdo dos arquivos BUILD e .bzl) não podem afetar como os gráficos de destino e de ação são criados.
E se eu precisar acessar os mesmos dados estruturados antes e durante a fase de execução?
Você pode formatar os dados estruturados como um arquivo .bzl. É possível usar load()
para acessar o arquivo
durante as fases de carregamento e análise. É possível passá-lo como uma entrada ou
runfile para ações e executáveis que precisam dele durante a fase de execução.
Como devo documentar o código Starlark?
Para regras e atributos de regras, transmita um literal de docstring (possivelmente
entre aspas triplas) ao parâmetro doc
de rule
ou attr.*()
. Para funções
e macros auxiliares, use um literal de docstring entre aspas triplas seguindo o formato
fornecido aqui.
As funções de implementação de regras geralmente não precisam de um docstring próprio.
O uso de literais de string nos locais esperados facilita a extração da documentação por ferramentas automatizadas. Fique à vontade para usar comentários padrão sem string sempre que isso ajudar o leitor do código.