Estes são alguns problemas e perguntas comuns sobre a criação de extensões.
Por que meu arquivo não é produzido ou minha ação nunca é executada?
O Bazel executa apenas as ações necessárias para produzir os arquivos de saída solicitados.
Se o arquivo que você quer tiver um rótulo, poderá solicitá-lo diretamente:
bazel build //pkg:myfile.txtSe o arquivo estiver em um grupo de saída do destino, talvez seja necessário especificar esse grupo de saída na linha de comando:
bazel build //pkg:mytarget --output_groups=fooSe você quiser que o arquivo seja criado automaticamente sempre que o destino for mencionado na linha de comando, adicione-o às saídas padrão da regra retornando um
DefaultInfoprovedor.
Consulte a página Regras para mais informações.
Por que minha função de implementação não é executada?
O Bazel analisa apenas os destinos solicitados para a build. Você precisa nomear o destino na linha de comando ou algo que dependa dele.
Um arquivo está ausente 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 que está sendo executada está acessando o arquivo usando o caminho correto.
Para ações, declare as entradas transmitindo-as para a função ctx.actions.* que cria a ação. O caminho correto para o arquivo pode ser obtido usando
File.path.
Para binários (as saídas executáveis executadas por um bazel run ou bazel test
comando), declare as entradas incluindo-as nos
runfiles. Em vez de usar o campo path, use
File.short_path, que é o caminho do arquivo em relação a
o diretório de arquivos de execução em que o binário é executado.
Como posso controlar quais arquivos são criados por bazel build //pkg:mytarget?
Use o provedor DefaultInfo para
definir as saídas padrão.
Como posso executar um programa ou fazer E/S de arquivo como parte da minha build?
Uma ferramenta pode ser declarada como um destino, assim como qualquer outra parte da 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 é possível realizar E/S de arquivo. Isso significa que as ferramentas e o conteúdo do arquivo (exceto o conteúdo dos arquivos BUILD e .bzl) não podem afetar a forma como os gráficos de destino e 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 load() o arquivo para acessá-lo durante as fases de carregamento e análise. Você pode transmiti-lo como uma entrada ou arquivo de execução 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 regra, você pode transmitir um literal de docstring (possivelmente entre aspas triplas) para o 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 da própria docstring.
O uso de literais de string nos lugares esperados facilita a extração de documentação por ferramentas automatizadas. Use comentários padrão que não sejam de string sempre que isso ajudar o leitor do código.