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.