Registros do Bazel

Informar um problema Acessar fonte

O Bzlmod descobre dependências solicitando informações dos registros do Bazel, bancos de dados de módulos do Bazel. Atualmente, o Bzlmod aceita apenas registros de índice, ou seja, diretórios locais ou servidores HTTP estáticos que seguem um formato específico.

Registro de índice

Um registro de índice é um diretório local ou um servidor HTTP estático que contém informações sobre uma lista de módulos, incluindo a página inicial, os mantenedores, o arquivo MODULE.bazel de cada versão e como buscar a origem de cada versão. Vale ressaltar que ele não precisa disponibilizar os arquivos de origem por si só.

Um registro de índice precisa seguir o formato abaixo:

  • /bazel_registry.json: um arquivo JSON que contém metadados para o registro, como:
    • mirrors: especifica a lista de espelhos a serem usados para arquivos de origem. O URL espelhado é uma concatenação do próprio espelho, e o URL de origem do módulo especificado pelo arquivo source.json sem o protocolo. Por exemplo, se o URL de origem de um módulo for https://foo.com/bar/baz e mirrors contiver ["https://mirror1.com/", "https://example.com/mirror2/"], os URLs que o Bazel testará na ordem serão https://mirror1.com/foo.com/bar/baz, https://example.com/mirror2/foo.com/bar/baz e, finalmente, o próprio URL de origem https://foo.com/bar/baz.
    • module_base_path: especifica o caminho base para módulos com o tipo local_repository no arquivo source.json.
  • /modules: um diretório que contém um subdiretório para cada módulo nesse registro
  • /modules/$MODULE: um diretório que contém um subdiretório para cada versão deste módulo, além de:
    • metadata.json: um arquivo JSON contendo informações sobre o módulo, com os seguintes campos:
      • homepage: o URL da página inicial do projeto
      • maintainers: uma lista de objetos JSON, cada um correspondente às informações de um mantenedor do módulo no registro. Observe que não é necessariamente o mesmo que os authors do projeto
      • versions: uma lista de todas as versões deste módulo disponíveis neste registro.
      • yanked_versions: um mapa de versões arrastadas do módulo. As chaves precisam ser versões a serem trocadas, e os valores precisam ser descrições do motivo da versão extraída, contendo, idealmente, um link para mais informações
  • /modules/$MODULE/$VERSION: um diretório contendo os seguintes arquivos:
    • MODULE.bazel: o arquivo MODULE.bazel desta versão do módulo.
    • source.json: um arquivo JSON que contém informações sobre como buscar a origem da versão do módulo.
      • O tipo padrão é "Archive", que representa um repositório http_archive, com os seguintes campos:
        • url: o URL do arquivo de origem
        • integrity: a soma de verificação da Integridade de sub-recursos do arquivo
        • strip_prefix: um prefixo de diretório a ser removido ao extrair o arquivo de origem.
        • patches: um mapa contendo arquivos de patch a serem aplicados ao arquivo extraído. Os arquivos de patch estão localizados no diretório /modules/$MODULE/$VERSION/patches. As chaves são os nomes dos arquivos de patch e os valores são a soma de verificação de integridade dos arquivos de patch.
        • patch_strip: igual ao argumento --strip do patch do Unix.
        • archive_type: o tipo de arquivo do arquivo transferido por download (igual a type no http_archive). Por padrão, o tipo é determinado a partir da extensão do URL. Se o arquivo não tiver extensão, você poderá especificar explicitamente uma das seguintes opções: "zip", "jar", "war", "aar", "tar", "tar.gz", "tgz", "tar.xz", "txz", "tar.zst", "tzst", tar.bz2, "ar" ou "deb".
      • O tipo pode ser alterado para usar um repositório git, com estes campos:
        • type: git_repository
        • Os campos a seguir, conforme descrito em https://bazel.build/rules/lib/repo/git:
          • remote
          • commit
          • shallow_since
          • tag
          • init_submodules
          • verbose
          • strip_prefix
      • O tipo pode ser alterado para usar um caminho local, que representa um repositório local_repository, com estes campos:
        • type: local_path
        • path: o caminho local para o repositório, calculado da seguinte maneira:
          • Se path for um caminho absoluto, ele permanecerá como está
          • Se path for um caminho relativo e module_base_path for um caminho absoluto, ele será resolvido como <module_base_path>/<path>
          • Se path e module_base_path forem caminhos relativos, ele será resolvido como <registry_path>/<module_base_path>/<path>. O registro precisa ser hospedado localmente e usado por --registry=file://<registry_path>. Caso contrário, o Bazel vai gerar um erro
    • patches/: um diretório opcional contendo arquivos de patch, usado somente quando source.json tem o tipo "arquivo"

Registro central do Bazel

O Registro Central do Bazel (BCR, na sigla em inglês) em https://bcr.bazel.build/ é um registro de índice com conteúdo apoiado pelo repositório do GitHub bazelbuild/bazel-central-registry (link em inglês). Navegue pelo conteúdo usando o front-end da Web em https://registry.bazel.build/.

A comunidade do Bazel mantém o BCR, e os colaboradores podem enviar solicitações de envio. Consulte as diretrizes de contribuição do BCR (em inglês).

Além de seguir o formato de um registro de índice normal, o BCR requer um arquivo presubmit.yml para cada versão do módulo (/modules/$MODULE/$VERSION/presubmit.yml). Esse arquivo especifica alguns destinos essenciais de build e teste que podem ser usados para verificar a validade dessa versão do módulo. Os pipelines de CI do BCR também usam isso para garantir a interoperabilidade entre os módulos.

Como selecionar registros

A flag repetível do Bazel --registry pode ser usada para especificar a lista de registros para solicitar módulos. Assim, você pode configurar o projeto para buscar dependências de um registro interno ou de terceiros. Registros anteriores têm precedência. Por conveniência, é possível colocar uma lista de sinalizações --registry no arquivo .bazelrc do seu projeto.

Se o registro estiver hospedado no GitHub (por exemplo, como uma bifurcação de bazelbuild/bazel-central-registry), o valor --registry precisará de um endereço bruto do GitHub em raw.githubusercontent.com. Por exemplo, na ramificação main da bifurcação my-org, defina --registry=https://raw.githubusercontent.com/my-org/bazel-central-registry/main/.

Usar a sinalização --registry impede que o Registro Central do Bazel seja usado por padrão, mas é possível adicioná-lo novamente adicionando --registry=https://bcr.bazel.build.