Devido às limitações do WORKSPACE, o Bzlmod vai substituir o sistema legado do WORKSPACE em versões futuras do Bazel. Este guia ajuda você a migrar seu projeto para o Bzlmod e remover o WORKSPACE para buscar dependências externas.
WORKSPACE x Bzlmod
O WORKSPACE e o Bzlmod do Bazel oferecem recursos semelhantes com sintaxes diferentes. Esta seção explica como migrar de funcionalidades específicas do WORKSPACE para o Bzlmod.
Definir a raiz de um espaço de trabalho do Bazel
O arquivo WORKSPACE marca a raiz de origem de um projeto do Bazel. Essa função é substituída pelo MODULE.bazel nas versões 6.3 e posteriores do Bazel. Com versões do Bazel anterior à 6.3, ainda deve haver um arquivo WORKSPACE
ou WORKSPACE.bazel
na raiz do espaço de trabalho, talvez com comentários como:
WORKSPACE
# This file marks the root of the Bazel workspace. # See MODULE.bazel for external dependencies setup.
Ativar o Bzlmod no seu bazelrc
Com .bazelrc
, é possível definir flags que são aplicadas sempre que você executa o Bazel. Para ativar o
Bzlmod, use a flag --enable_bzlmod
e aplique-a ao comando common
para
que ela seja aplicada a todos os comandos:
.bazelrc
# Enable Bzlmod for every Bazel command common --enable_bzlmod
Especificar o nome do repositório para seu espaço de trabalho
WORKSPACE
A função
workspace
é usada para especificar um nome de repositório para seu espaço de trabalho. Isso permite que um//foo:bar
de destino no espaço de trabalho seja referenciado como@<workspace name>//foo:bar
. Se não for especificado, o nome padrão do repositório para seu espaço de trabalho será__main__
.## WORKSPACE workspace(name = "com_foo_bar")
Bzlmod
Recomendamos referenciar destinos no mesmo espaço de trabalho com a sintaxe
//foo:bar
sem@<repo name>
. Mas, se você precisar da sintaxe antiga, use o nome do módulo especificado pela funçãomodule
como o nome do repositório. Se o nome do módulo for diferente do nome do repositório necessário, use o atributorepo_name
da funçãomodule
para substituir o nome do repositório.## MODULE.bazel module( name = "bar", repo_name = "com_foo_bar", )
Buscar dependências externas como módulos do Bazel
Se a sua dependência for um projeto do Bazel, você poderá depender dela como um módulo do Bazel quando ela também adotar o Bzlmod.
WORKSPACE
Com o WORKSPACE, é comum usar as regras de repositório
http_archive
ougit_repository
para baixar as fontes do projeto do Bazel.## WORKSPACE load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "bazel_skylib", urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz"], sha256 = "66ffd9315665bfaafc96b52278f57c7e2dd09f5ede279ea6d39b2be471e7e3aa", ) load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() http_archive( name = "rules_java", urls = ["https://github.com/bazelbuild/rules_java/releases/download/6.1.1/rules_java-6.1.1.tar.gz"], sha256 = "76402a50ae6859d50bd7aed8c1b8ef09dae5c1035bb3ca7d276f7f3ce659818a", ) load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") rules_java_dependencies() rules_java_toolchains()
Como você pode ver, é um padrão comum que os usuários precisem carregar dependências transitivas de uma macro da dependência. Suponha que
bazel_skylib
erules_java
dependam deplatform
. A versão exata da dependênciaplatform
é determinada pela ordem das macros.Bzlmod
Com o Bzlmod, desde que a dependência esteja disponível no Registro central do Bazel ou no registro do Bazel personalizado, é possível depender dela com uma diretiva
bazel_dep
.## MODULE.bazel bazel_dep(name = "bazel_skylib", version = "1.4.2") bazel_dep(name = "rules_java", version = "6.1.1")
O Bzlmod resolve as dependências de módulos do Bazel de maneira transitiva usando o algoritmo MVS. Portanto, a versão máxima necessária de
platform
é selecionada automaticamente.
Substituir uma dependência como um módulo do Bazel
Como módulo raiz, você pode substituir as dependências do módulo do Bazel de diferentes maneiras.
Leia a seção substituições para mais informações.
Confira alguns exemplos de uso no repositório examples.
Buscar dependências externas com extensões de módulo
Se a dependência não for um projeto do Bazel ou ainda não estiver disponível em nenhum registro do Bazel, use use_repo_rule
ou extensões de
módulo.
WORKSPACE
Faça o download de um arquivo usando a regra de repositório
http_file
.## WORKSPACE load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") http_file( name = "data_file", url = "http://example.com/file", sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", )
Bzlmod
Com o Bzlmod, é possível usar a diretiva
use_repo_rule
no arquivo MODULE.bazel para instanciar repositórios diretamente:## MODULE.bazel http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") http_file( name = "data_file", url = "http://example.com/file", sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", )
Em segundo plano, isso é implementado usando uma extensão de módulo. Se você precisar realizar uma lógica mais complexa do que simplesmente invocar uma regra de repositório, também poderá implementar uma extensão de módulo por conta própria. Você precisará mover a definição para um arquivo
.bzl
, que também permite compartilhar a definição entre WORKSPACE e Bzlmod durante o período de migração.## repositories.bzl load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") def my_data_dependency(): http_file( name = "data_file", url = "http://example.com/file", sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", )
Implemente uma extensão de módulo para carregar a macro de dependências. É possível definir no mesmo arquivo
.bzl
da macro, mas para manter a compatibilidade com versões mais antigas do Bazel, é melhor definir em um arquivo.bzl
separado.## extensions.bzl load("//:repositories.bzl", "my_data_dependency") def _non_module_dependencies_impl(_ctx): my_data_dependency() non_module_dependencies = module_extension( implementation = _non_module_dependencies_impl, )
Para tornar o repositório visível ao projeto raiz, declare os usos da extensão do módulo e do repositório no arquivo MODULE.bazel.
## MODULE.bazel non_module_dependencies = use_extension("//:extensions.bzl", "non_module_dependencies") use_repo(non_module_dependencies, "data_file")
Resolver conflitos de dependências externas usando extensões de módulo
Um projeto pode fornecer uma macro que introduz repositórios externos com base em entradas dos chamadores. Mas e se houver vários chamadores no gráfico de dependências e eles causarem um conflito?
Suponha que o projeto foo
forneça a seguinte macro, que usa version
como argumento.
## repositories.bzl in foo {:#repositories.bzl-foo}
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
def data_deps(version = "1.0"):
http_file(
name = "data_file",
url = "http://example.com/file-%s" % version,
# Omitting the "sha256" attribute for simplicity
)
WORKSPACE
Com o WORKSPACE, é possível carregar a macro de
@foo
e especificar a versão da dependência de dados necessária. Suponha que você tenha outra dependência@bar
, que também depende de@foo
, mas exige uma versão diferente da dependência de dados.## WORKSPACE # Introduce @foo and @bar. ... load("@foo//:repositories.bzl", "data_deps") data_deps(version = "2.0") load("@bar//:repositories.bzl", "bar_deps") bar_deps() # -> which calls data_deps(version = "3.0")
Nesse caso, o usuário final precisa ajustar cuidadosamente a ordem das macros no WORKSPACE para conseguir a versão necessária. Esse é um dos maiores problemas do WORKSPACE, já que ele não oferece uma maneira sensata de resolver dependências.
Bzlmod
Com o Bzlmod, o autor do projeto
foo
pode usar a extensão do módulo para resolver conflitos. Por exemplo, suponha que faça sentido sempre selecionar a versão máxima necessária da dependência de dados entre todos os módulos do Bazel.## extensions.bzl in foo load("//:repositories.bzl", "data_deps") data = tag_class(attrs={"version": attr.string()}) def _data_deps_extension_impl(module_ctx): # Select the maximal required version in the dependency graph. version = "1.0" for mod in module_ctx.modules: for data in mod.tags.data: version = max(version, data.version) data_deps(version) data_deps_extension = module_extension( implementation = _data_deps_extension_impl, tag_classes = {"data": data}, )
## MODULE.bazel in bar bazel_dep(name = "foo", version = "1.0") foo_data_deps = use_extension("@foo//:extensions.bzl", "data_deps_extension") foo_data_deps.data(version = "3.0") use_repo(foo_data_deps, "data_file")
## MODULE.bazel in root module bazel_dep(name = "foo", version = "1.0") bazel_dep(name = "bar", version = "1.0") foo_data_deps = use_extension("@foo//:extensions.bzl", "data_deps_extension") foo_data_deps.data(version = "2.0") use_repo(foo_data_deps, "data_file")
Nesse caso, o módulo raiz exige a versão de dados
2.0
, enquanto a dependênciabar
exige3.0
. A extensão do módulo emfoo
pode resolver esse conflito corretamente e selecionar automaticamente a versão3.0
para a dependência de dados.
Integrar um gerenciador de pacotes de terceiros
Seguindo a última seção, como a extensão do módulo oferece uma maneira de coletar informações do gráfico de dependências, execute uma lógica personalizada para resolver dependências e chame regras de repositório para introduzir repositórios externos. Isso oferece uma ótima maneira para os autores de regras aprimorarem os conjuntos de regras que integram gerenciadores de pacotes para linguagens específicas.
Leia a página extensões de módulo para saber mais sobre como usar extensões de módulo.
Confira uma lista dos conjuntos de regras que já adotaram o Bzlmod para buscar dependências de diferentes gerenciadores de pacotes:
Um exemplo mínimo que integra um gerenciador de pseudopacotes está disponível no repositório examples.
Detectar toolchains na máquina host
Quando as regras de build do Bazel precisam detectar os conjuntos de ferramentas que estão disponíveis na sua máquina host, elas usam regras de repositório para inspecionar a máquina host e gerar informações sobre esses conjuntos como repositórios externos.
WORKSPACE
Considere a seguinte regra de repositório para detectar um conjunto de ferramentas de shell.
## local_config_sh.bzl def _sh_config_rule_impl(repository_ctx): sh_path = get_sh_path_from_env("SH_BIN_PATH") if not sh_path: sh_path = detect_sh_from_path() if not sh_path: sh_path = "/shell/binary/not/found" repository_ctx.file("BUILD", """ load("@bazel_tools//tools/sh:sh_toolchain.bzl", "sh_toolchain") sh_toolchain( name = "local_sh", path = "{sh_path}", visibility = ["//visibility:public"], ) toolchain( name = "local_sh_toolchain", toolchain = ":local_sh", toolchain_type = "@bazel_tools//tools/sh:toolchain_type", ) """.format(sh_path = sh_path)) sh_config_rule = repository_rule( environ = ["SH_BIN_PATH"], local = True, implementation = _sh_config_rule_impl, )
É possível carregar a regra do repositório no WORKSPACE.
## WORKSPACE load("//:local_config_sh.bzl", "sh_config_rule") sh_config_rule(name = "local_config_sh")
Bzlmod
Com o Bzlmod, é possível introduzir o mesmo repositório usando uma extensão de módulo, que é semelhante à introdução do repositório
@data_file
na última seção.## local_config_sh_extension.bzl load("//:local_config_sh.bzl", "sh_config_rule") sh_config_extension = module_extension( implementation = lambda ctx: sh_config_rule(name = "local_config_sh"), )
Em seguida, use a extensão no arquivo MODULE.bazel.
## MODULE.bazel sh_config_ext = use_extension("//:local_config_sh_extension.bzl", "sh_config_extension") use_repo(sh_config_ext, "local_config_sh")
Registrar conjuntos de ferramentas e plataformas de execução
Seguindo a última seção, depois de apresentar informações sobre um conjunto de ferramentas de hospedagem de repositório (por exemplo, local_config_sh
), provavelmente você vai querer registrar esse recurso.
WORKSPACE
Com WORKSPACE, é possível registrar o conjunto de ferramentas das seguintes maneiras.
É possível registrar o conjunto de ferramentas no arquivo
.bzl
e carregar a macro no arquivo WORKSPACE.## local_config_sh.bzl def sh_configure(): sh_config_rule(name = "local_config_sh") native.register_toolchains("@local_config_sh//:local_sh_toolchain")
## WORKSPACE load("//:local_config_sh.bzl", "sh_configure") sh_configure()
Ou registre o conjunto de ferramentas diretamente no arquivo WORKSPACE.
## WORKSPACE load("//:local_config_sh.bzl", "sh_config_rule") sh_config_rule(name = "local_config_sh") register_toolchains("@local_config_sh//:local_sh_toolchain")
Bzlmod
Com o Bzlmod, as APIs
register_toolchains
eregister_execution_platforms
só estão disponíveis no arquivo MODULE.bazel. Não é possível chamarnative.register_toolchains
em uma extensão de módulo.## MODULE.bazel sh_config_ext = use_extension("//:local_config_sh_extension.bzl", "sh_config_extension") use_repo(sh_config_ext, "local_config_sh") register_toolchains("@local_config_sh//:local_sh_toolchain")
Os conjuntos de ferramentas e as plataformas de execução registrados em WORKSPACE
,
WORKSPACE.bzlmod
e no arquivo MODULE.bazel
de cada módulo do Bazel seguem esta
ordem de precedência durante a seleção do conjunto de ferramentas (da mais alta para a mais baixa):
- conjuntos de ferramentas e plataformas de execução registrados no arquivo
MODULE.bazel
do módulo raiz. - conjuntos de ferramentas e plataformas de execução registrados no arquivo
WORKSPACE
ouWORKSPACE.bzlmod
. - conjuntos de ferramentas e plataformas de execução registrados por módulos que são dependências (transitivas) do módulo raiz.
- quando não usar
WORKSPACE.bzlmod
: toolchains registradas no sufixo deWORKSPACE
.
Apresentar repositórios locais
Talvez seja necessário introduzir uma dependência como um repositório local quando você precisar de uma versão local da dependência para depuração ou quiser incorporar um diretório no seu espaço de trabalho como um repositório externo.
WORKSPACE
Com WORKSPACE, isso é feito por duas regras de repositório nativas,
local_repository
enew_local_repository
.## WORKSPACE local_repository( name = "rules_java", path = "/Users/bazel_user/workspace/rules_java", )
Bzlmod
Com o Bzlmod, é possível usar
local_path_override
para substituir um módulo por um caminho local.## MODULE.bazel bazel_dep(name = "rules_java") local_path_override( module_name = "rules_java", path = "/Users/bazel_user/workspace/rules_java", )
Também é possível introduzir um repositório local com extensão de módulo. No entanto, não é possível chamar
native.local_repository
na extensão do módulo. Há um esforço contínuo para converter para Starlark todas as regras de repositório nativas. Confira #18285 para acompanhar o progresso. Em seguida, chame olocal_repository
correspondente do Starlark em uma extensão de módulo. Também é muito simples implementar uma versão personalizada da regra de repositóriolocal_repository
, caso isso represente um problema para você.
Vincular destinos
A regra bind
no WORKSPACE foi descontinuada e não é compatível com o Bzlmod. Ela foi introduzida para dar a um destino um alias no
pacote especial //external
. Todos os usuários que dependem dela precisam migrar.
Por exemplo, se você tiver
## WORKSPACE
bind(
name = "openssl",
actual = "@my-ssl//src:openssl-lib",
)
Isso permite que outros destinos dependam de //external:openssl
. Para deixar de usar
essa abordagem, faça o seguinte:
Substitua todos os usos de
//external:openssl
por@my-ssl//src:openssl-lib
.Ou use a regra de build
alias
Defina a seguinte meta em um pacote (por exemplo,
//third_party
):## third_party/BUILD alias( name = "openssl, actual = "@my-ssl//src:openssl-lib", )
Substitua todos os usos de
//external:openssl
por//third_party:openssl-lib
.
Migração
Esta seção fornece informações e orientações úteis para o processo de migração do Bzlmod.
Conhecer suas dependências no WORKSPACE
A primeira etapa da migração é entender quais dependências você tem. Pode ser difícil descobrir quais dependências exatas são introduzidas no arquivo WORKSPACE porque as dependências transitivas geralmente são carregadas com macros *_deps
.
Inspecionar dependência externa com arquivo resolvido do espaço de trabalho
Felizmente, a flag
--experimental_repository_resolved_file
pode ajudar. Essa flag gera essencialmente um "arquivo de bloqueio" de todas as dependências externas buscadas no último comando do Bazel. Confira mais detalhes neste post.
Ela pode ser usada de duas maneiras:
Para buscar informações de dependências externas necessárias para criar determinados destinos.
bazel clean --expunge bazel build --nobuild --experimental_repository_resolved_file=resolved.bzl //foo:bar
Para buscar informações de todas as dependências externas definidas no arquivo WORKSPACE.
bazel clean --expunge bazel sync --experimental_repository_resolved_file=resolved.bzl
Com o comando
bazel sync
, é possível buscar todas as dependências definidas no arquivo WORKSPACE, incluindo:- Usos do
bind
- Usos de
register_toolchains
eregister_execution_platforms
No entanto, se o projeto for multiplataforma, a sincronização do Bazel poderá falhar em determinadas plataformas porque algumas regras de repositório só serão executadas corretamente em plataformas compatíveis.
- Usos do
Depois de executar o comando, você terá informações sobre suas dependências
externas no arquivo resolved.bzl
.
Inspecionar dependência externa com bazel query
Você também pode usar o bazel query
para inspecionar regras de repositório com
bazel query --output=build //external:<repo name>
Embora seja mais conveniente e muito mais rápido, bazel query pode fornecer informações incorretas sobre a versão da dependência externa, então tenha cuidado ao usá-lo! A consulta e a inspeção de dependências externas com o Bzlmod serão feitas com um novo subcomando.
Dependências padrão integradas
Se você verificar o arquivo gerado por --experimental_repository_resolved_file
,
vai encontrar muitas dependências que não estão definidas no WORKSPACE.
Isso acontece porque o Bazel adiciona prefixos e sufixos ao conteúdo do arquivo WORKSPACE do usuário para injetar algumas dependências padrão, que geralmente são exigidas por regras nativas (por exemplo, @bazel_tools
, @platforms
e @remote_java_tools
). Com o Bzlmod, essas dependências são introduzidas com um módulo integrado bazel_tools
, que é uma dependência padrão para todos os outros módulos do Bazel.
Modo híbrido para migração gradual
O Bzlmod e o WORKSPACE podem trabalhar lado a lado, o que permite que a migração de dependências do arquivo WORKSPACE para o Bzlmod seja um processo gradual.
WORKSPACE.bzlmod
Durante a migração, os usuários do Bazel talvez precisem alternar entre builds com e sem o Bzlmod ativado. O suporte ao WORKSPACE.bzlmod é implementado para facilitar o processo.
WORKSPACE.bzlmod tem exatamente a mesma sintaxe que WORKSPACE. Quando o Bzlmod está ativado, e se também houver um arquivo WORKSPACE.bzlmod na raiz do espaço de trabalho:
WORKSPACE.bzlmod
entra em vigor, e o conteúdo deWORKSPACE
é ignorado.- Nenhum prefixo ou sufixo é adicionado ao arquivo WORKSPACE.bzlmod.
Usar o arquivo WORKSPACE.bzlmod pode facilitar a migração porque:
- Quando o Bzlmod está desativado, você volta a buscar dependências do arquivo WORKSPACE original.
- Quando o Bzlmod está ativado, é possível acompanhar melhor quais dependências ainda precisam ser migradas com o WORKSPACE.bzlmod.
Visibilidade do repositório
O Bzlmod pode controlar quais outros repositórios ficam visíveis em um determinado repositório. Confira nomes de repositório e dependências estritas para mais detalhes.
Confira um resumo das visibilidades de repositórios de diferentes tipos de repositórios, considerando também o WORKSPACE.
Do repositório principal | Dos repositórios de módulos do Bazel | De repositórios de extensão de módulo | Dos repositórios do WORKSPACE | |
---|---|---|---|---|
O repositório principal | Visível | Se o módulo raiz for uma dependência direta | Se o módulo raiz for uma dependência direta do módulo que hospeda a extensão de módulo | Visível |
Repositórios de módulos do Bazel | Dependências diretas | Dependências diretas | Dependências diretas do módulo que hospeda a extensão do módulo | Dependências diretas do módulo raiz |
Repositórios de extensão de módulo | Dependências diretas | Dependências diretas | Dependências diretas do módulo que hospeda a extensão do módulo + todos os repositórios gerados pela mesma extensão do módulo | Dependências diretas do módulo raiz |
Repositórios do WORKSPACE | Todos visíveis | Não visível | Não visível | Todos visíveis |
Processo de migração
Um processo típico de migração do Bzlmod pode ser assim:
- Entenda quais dependências você tem no WORKSPACE.
- Adicione um arquivo MODULE.bazel vazio na raiz do projeto.
- Adicione um arquivo WORKSPACE.bzlmod vazio para substituir o conteúdo do arquivo WORKSPACE.
- Crie seus destinos com o Bzlmod ativado e verifique qual repositório está faltando.
- Verifique a definição do repositório ausente no arquivo de dependência resolvido.
- Introduza a dependência ausente como um módulo do Bazel, usando uma extensão de módulo, ou deixe-a no WORKSPACE.bzlmod para migração posterior.
- Volte para a etapa 4 e repita até que todas as dependências estejam disponíveis.
Ferramenta de migração
Há um script auxiliar interativo de migração do Bzlmod que pode ajudá-lo a começar.
O script faz o seguinte:
- Gera e analisa o arquivo resolvido WORKSPACE.
- Imprime informações do repositório do arquivo resolvido de maneira legível.
- Executa o comando "bazel build", detecta mensagens de erro reconhecidas e recomenda uma maneira de migrar.
- Verifica se uma dependência já está disponível no BCR.
- Adiciona uma dependência ao arquivo MODULE.bazel.
- Adiciona uma dependência usando uma extensão de módulo.
- Adiciona uma dependência ao arquivo WORKSPACE.bzlmod.
Para usá-lo, verifique se você tem a versão mais recente do Bazel instalada e execute o comando a seguir:
git clone https://github.com/bazelbuild/bazel-central-registry.git
cd <your workspace root>
<BCR repo root>/tools/migrate_to_bzlmod.py -t <your build targets>
Publicar módulos do Bazel
Se o projeto do Bazel for uma dependência de outros projetos, publique-o no Registro central do Bazel.
Para fazer check-in do seu projeto no BCR, você precisa de um URL de arquivo de origem do projeto. Ao criar o arquivo de origem, observe alguns pontos:
Verifique se o arquivo está apontando para uma versão específica.
O BCR só pode aceitar arquivos de origem com versão porque o Bzlmod precisa fazer a comparação de versões durante a resolução de dependências.
Verifique se o URL do arquivo está estável.
O Bazel verifica o conteúdo do arquivo com um valor de hash. Portanto, certifique-se de que o checksum do arquivo baixado permaneça inalterado. Se o URL for do GitHub, crie e faça upload de um arquivo de lançamento na página de lançamento. O GitHub não garante o checksum dos arquivos de origem gerados sob demanda. Em resumo, URLs no formato
https://github.com/<org>/<repo>/releases/download/...
são considerados estáveis enquantohttps://github.com/<org>/<repo>/archive/...
não é. Confira Interrupção no checksum de arquivos do GitHub (em inglês) para mais contexto.Verifique se a árvore de origem segue o layout do repositório original.
Se o repositório for muito grande e você quiser criar um arquivo de distribuição com tamanho reduzido removendo fontes desnecessárias, verifique se a árvore de origem removida é um subconjunto da árvore de origem original. Assim, os usuários finais vão poder substituir facilmente o módulo por uma versão não lançada usando
archive_override
egit_override
.Inclua um módulo de teste em um subdiretório que teste as APIs mais comuns.
Um módulo de teste é um projeto do Bazel com arquivos WORKSPACE e MODULE.bazel localizados em um subdiretório do arquivo de origem que depende do módulo real a ser publicado. Ele precisa conter exemplos ou alguns testes de integração que abranjam as APIs mais comuns. Consulte o módulo de teste para saber como configurar.
Quando o URL do arquivo de origem estiver pronto, siga as diretrizes de contribuição do BCR para enviar seu módulo ao BCR com uma solicitação de pull do GitHub.
É altamente recomendável configurar o app do GitHub Publish to BCR para seu repositório, a fim de automatizar o processo de envio do seu módulo ao BCR.
Práticas recomendadas
Esta seção documenta algumas práticas recomendadas para gerenciar melhor suas dependências externas.
Divida os destinos em pacotes diferentes para evitar buscar dependências desnecessárias.
Confira #12835, em que as dependências de desenvolvimento para testes são buscadas desnecessariamente para criar destinos que não precisam delas. Isso não é específico do Bzlmod, mas seguir essas práticas facilita a especificação correta das dependências de desenvolvimento.
Especificar dependências de desenvolvimento
É possível definir o atributo dev_dependency
como verdadeiro para as diretivas
bazel_dep
e
use_extension
, para que
elas não sejam propagadas para projetos dependentes. Como módulo raiz, você pode usar a flag
--ignore_dev_dependency
para verificar se seus destinos
ainda são criados sem dependências de desenvolvimento e substituições.
Progresso da migração da comunidade
Confira o Registro central do Bazel para saber se as dependências já estão disponíveis. Caso contrário, participe desta discussão no GitHub para votar ou publicar as dependências que estão impedindo sua migração.
Informar problemas
Confira a lista de problemas do Bazel no GitHub para ver problemas conhecidos do Bzlmod. Fique à vontade para registrar novos problemas ou solicitações de recursos que possam ajudar a viabilizar sua migração.