Modo do fornecedor

O modo de fornecedor é um recurso do Bzlmod que permite criar uma cópia local de dependências externas. Isso é útil para builds off-line ou quando você quer controlar a origem de uma dependência externa.

Ativar o modo de fornecedor

É possível ativar o modo de fornecedor especificando a sinalização --vendor_dir.

Por exemplo, ao adicioná-lo ao arquivo .bazelrc:

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

O diretório do fornecedor pode ser um caminho relativo para a raiz do espaço de trabalho ou um caminho absoluto.

Fornecer um repositório externo específico

É possível usar o comando vendor com a sinalização --repo para especificar qual repositório será oferecido pelo fornecedor. Ele aceita o nome do repositório canônico e o nome do repositório aparente (links em inglês).

Por exemplo, executando:

bazel vendor --vendor_dir=vendor_src --repo=@rules_cc

ou

bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~

ambos vão receber "rules_cc" em <workspace root>/vendor_src/rules_cc~.

Dependências externas do fornecedor para determinados destinos

Para disponibilizar todas as dependências externas necessárias para criar determinados padrões de destino, execute bazel vendor <target patterns>.

Por exemplo:

bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...

vai fornecer todos os repositórios necessários para criar o destino //src/main:hello-world e todos os destinos em //src/test/... com a configuração atual.

Em segundo plano, ele executa um comando bazel build --nobuild para analisar os padrões de destino. Portanto, as sinalizações de criação podem ser aplicadas a esse comando e afetam o resultado.

Criar o destino off-line

Com as dependências externas disponibilizadas, você pode criar o destino off-line

bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...

O build precisa funcionar em um ambiente de build limpo, sem acesso à rede e cache de repositório.

Portanto, você deve ser capaz de verificar a origem fornecida e criar os mesmos destinos off-line em outra máquina.

Fornecedor: todas as dependências externas

Para fornecer todos os repositórios no seu gráfico de dependências externas transitivas, execute:

bazel vendor --vendor_dir=vendor_src

Observe que a disponibilização de todas as dependências tem algumas desvantagens:

  • Buscar todos os repositórios, incluindo os introduzidos de maneira transitiva, pode ser demorado.
  • O diretório de fornecedores pode ficar muito grande.
  • Alguns repositórios podem não ser buscados se não forem compatíveis com a plataforma ou o ambiente atual.

Portanto, considere primeiro a disponibilização de fornecedores para destinos específicos.

Configurar o modo de fornecedor com VENDOR.bazel

É possível controlar como determinados repositórios são processados com o arquivo VENDOR.bazel localizado no diretório do fornecedor.

Há duas diretivas disponíveis, ambas aceitando uma lista de nomes de repositórios canônicos como argumentos:

  • ignore(): para ignorar completamente um repositório no modo de fornecedor.
  • pin(): para fixar um repositório na origem fornecida atualmente, como se houvesse uma flag --override_repository para esse repositório. O Bazel NÃO atualizará a fonte fornecida para esse repositório durante a execução do comando do fornecedor, a menos que ela esteja liberada. O usuário pode modificar e manter manualmente a origem fornecida para esse repositório.

Por exemplo:

ignore("@@rules_cc~")
pin("@@bazel_skylib~")

Com esta configuração

  • Os dois repositórios serão excluídos dos comandos subsequentes do fornecedor.
  • O repo bazel_skylib será substituído pela origem localizada no diretório de fornecedores.
  • O usuário pode modificar com segurança a fonte fornecida de bazel_skylib.
  • Para refornecer o bazel_skylib, o usuário precisa desativar a instrução de fixação primeiro.

Entender como o modo de fornecedor funciona

O Bazel busca as dependências externas de um projeto em $(bazel info output_base)/external. Fornecer dependências externas significa mover arquivos e diretórios relevantes para um determinado diretório de fornecedor e usar o código-fonte fornecido para builds posteriores.

O conteúdo disponibilizado inclui:

  • O diretório repo
  • O arquivo de marcador do repo

Durante uma criação, se o arquivo de marcador disponibilizado estiver atualizado ou o repositório estiver fixado no arquivo VENDOR.bazel, o Bazel usará a origem fornecida criando um link simbólico para ela em $(bazel info output_base)/external em vez de executar a regra do repositório. Caso contrário, um aviso será mostrado, e o Bazel vai recorrer à busca da versão mais recente do repositório.