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 do fornecedor especificando a flag --vendor_dir
.
Por exemplo, adicionando-o 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 à 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 flag --repo
para especificar qual repositório
para o fornecedor. Ele aceita o nome
do repositório canônico e o nome
do repositório aparente.
Por exemplo, execute:
bazel vendor --vendor_dir=vendor_src --repo=@rules_cc
ou
bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+
fará com que rules_cc seja fornecido pelo fornecedor em
<workspace root>/vendor_src/rules_cc+
.
Dependências externas do fornecedor para destinos específicos
Para fornecer 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.
Por trás, ele executa um comando bazel build --nobuild
para analisar os
padrões de destino. Portanto, as flags de build podem ser aplicadas a esse comando e
afetar o resultado.
Criar o destino off-line
Com as dependências externas fornecidas pelo fornecedor, é possível 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 do repositório.
Portanto, você pode verificar a origem do fornecedor e criar os mesmos alvos off-line em outra máquina.
Fornecer todas as dependências externas
Para vender todos os repositórios no gráfico de dependências externas transitivas, execute:
bazel vendor --vendor_dir=vendor_src
O fornecimento de todas as dependências tem algumas desvantagens:
- A busca de todos os repositórios, incluindo os introduzidos transitivamente, pode levar muito tempo.
- O diretório do fornecedor 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 vender para públicos-alvo específicos primeiro.
Configurar o modo de fornecedor com VENDOR.bazel
É possível controlar como os 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ório canônicos como argumentos:
ignore()
: para ignorar completamente um repositório no modo do fornecedor.pin()
: para fixar um repositório na origem de fornecedor atual como se houvesse uma flag--override_repository
para esse repositório. O Bazel NÃO vai atualizar a fonte fornecida para este repositório durante a execução do comando do fornecedor, a menos que ela seja desfixada. O usuário pode modificar e manter a fonte fornecida pelo fornecedor desse repositório manualmente.
Por exemplo:
ignore("@@rules_cc+")
pin("@@bazel_skylib+")
Com essa configuração
- Os dois repositórios serão excluídos dos comandos do fornecedor subsequentes.
- O repositório
bazel_skylib
será substituído pela origem localizada no diretório do fornecedor. - O usuário pode modificar com segurança a origem do fornecedor de
bazel_skylib
. - Para reenviar
bazel_skylib
, o usuário precisa desativar a declaração de PIN.
Entender como o modo de fornecedor funciona
O Bazel busca dependências externas de um projeto em $(bazel info
output_base)/external
. Fornecer dependências externas significa mover
arquivos e diretórios relevantes para o diretório do fornecedor e usar a
origem fornecida para builds posteriores.
O conteúdo vendido inclui:
- Diretório do repositório
- O arquivo de marcador do repositório
Durante um build, se o arquivo de marcador do fornecedor estiver atualizado ou o repositório estiver
fixado no arquivo VENDOR.bazel, o Bazel vai usar a origem do fornecedor criando
um link simbólico para ele em $(bazel info output_base)/external
em vez de executar
a regra do repositório. Caso contrário, um aviso será impresso e o Bazel vai
usar a versão mais recente do repositório.
Arquivos de registro do fornecedor
O Bazel precisa executar a resolução do módulo para buscar dependências
externas, o que pode exigir o acesso a arquivos de registro pela Internet. Para
fazer o build off-line, os fornecedores do Bazel extraem todos os arquivos de registro da
rede no diretório <vendor_dir>/_registries
.
Symlinks do fornecedor
Os repositórios externos podem conter links simbólicos que apontam para outros arquivos ou diretórios. Para garantir que os links simbólicos funcionem corretamente, o Bazel usa a seguinte estratégia para reescrever links simbólicos na origem do fornecedor:
- Crie um link simbólico
<vendor_dir>/bazel-external
que aponte para$(bazel info output_base)/external
. Ela é atualizada automaticamente por cada comando do Bazel. - Para a origem do fornecedor, reescreva todos os links simbólicos que originalmente apontam para um
caminho em
$(bazel info output_base)/external
para um caminho relativo em<vendor_dir>/bazel-external
.
Por exemplo, se o link simbólico original for
<vendor_dir>/repo_foo+/link => $(bazel info output_base)/external/repo_bar+/file
Ele será reescrito para
<vendor_dir>/repo_foo+/link => ../../bazel-external/repo_bar+/file
onde
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
Como o <vendor_dir>/bazel-external
é gerado automaticamente pelo Bazel, é
recomendado adicioná-lo a .gitignore
ou equivalente para evitar a verificação.
Com essa estratégia, os links simbólicos na fonte do fornecedor devem funcionar corretamente, mesmo depois que a fonte do fornecedor for movida para outro local ou a base de saída do Bazel for alterada.