Modo do fornecedor

Informar um problema Mostrar fonte Por noite · 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 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 repo para o fornecedor, ele aceita repositórios canônicos name e repositório aparente nome.

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 segmentação, 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.

Nos bastidores, ele executa um comando bazel build --nobuild para analisar a 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 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 repositório de cache de código aberto.

Portanto, você deve ser capaz de verificar a fonte fornecida e criar os mesmos 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, você pode executar:

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 gerenciados com o arquivo VENDOR.bazel localizado no diretório de fornecedores.

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 um Sinalização --override_repository para este repositório. O Bazel NÃO vai atualizar os arquivos origem neste repositório enquanto executa o comando do fornecedor, a menos que ele esteja liberado. 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 repositório bazel_skylib será substituído pela origem localizada no fornecedor.
  • O usuário pode modificar com segurança a fonte fornecida de bazel_skylib.
  • Para fazer um novo fornecedor de bazel_skylib, o usuário precisa desativar a declaração de PIN 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 migrar arquivos e diretórios relevantes para o diretório de fornecedor especificado e usar o fonte fornecida para builds posteriores.

O conteúdo disponibilizado inclui:

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

Durante uma compilação, se o arquivo de marcadores fornecido estiver atualizado ou se o repositório estiver atualizado fixado no arquivo VENDOR.bazel, o Bazel usa a fonte fornecida criando um link simbólico para ela em $(bazel info output_base)/external em vez de executando a regra de repositório. Caso contrário, um aviso é exibido, e o Bazel substituto para buscar a versão mais recente do repositório.

Arquivos de registro do fornecedor

O Bazel precisa executar a resolução de módulo dele para buscar dados externos que podem exigir o acesso a arquivos de registro pela Internet. Para compilar off-line, o Bazel fornece todos os arquivos de registro buscados 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 o seguinte: estratégia para reescrever symlinks na fonte fornecida:

  • Crie um link simbólico <vendor_dir>/bazel-external que aponte para $(bazel info output_base)/external. Ele é atualizado a cada comando do Bazel automaticamente.
  • Para a fonte fornecida, reescreva todos os links simbólicos que originalmente apontam para uma 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 <vendor_dir>/bazel-external é gerado automaticamente pelo Bazel, é recomendado adicioná-lo a .gitignore ou equivalente para evitar o check-in.

Com essa estratégia, os links simbólicos na fonte fornecida devem funcionar corretamente, mesmo depois que a origem fornecida for movida para outro local ou para a base de saída do Bazel. é alterado.