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 repo
Durante uma criaçã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
.
Links simbólicos 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 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
. Ela é atualizada 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.