Modo do fornecedor

Informar um problema Ver código-fonte Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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.

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.