Arquivo de bloqueio do Bazel

Informar um problema Mostrar fonte Por noite · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

O recurso de bloqueio de arquivos do Bazel permite a gravação de versões ou dependências de bibliotecas ou pacotes de software exigidos por um projeto. Ela faz isso armazenando o resultado da resolução do módulo e da extensão e avaliação de desempenho. O lockfile promove builds reproduzíveis, garantindo ambientes de desenvolvimento de software. Além disso, ela melhora a eficiência do build, permitindo Bazel para pular o processo de resolução quando não há mudanças no projeto dependências. Além disso, o lockfile melhora a estabilidade, evitando com atualizações inesperadas e alterações interruptivas em bibliotecas externas, reduzindo o risco de introduzir bugs.

Geração de arquivo de bloqueio

O arquivo de bloqueio é gerado na raiz do espaço de trabalho com o nome MODULE.bazel.lock: Ele é criado ou atualizado durante o processo de build especificamente após a resolução do módulo e a avaliação da extensão. O arquivo de bloqueio captura o estado atual do projeto, incluindo o arquivo MODULE, os sinalizadores, substituições e outras informações relevantes. É importante ressaltar que ele inclui apenas dependências incluídas na invocação atual do build.

Quando ocorrem alterações no projeto que afetam suas dependências, o arquivo de bloqueio é atualizado automaticamente para refletir o novo estado. Isso garante que o arquivo de bloqueio permanece focado no conjunto específico de dependências necessárias para o criar, fornecendo uma representação precisa das questões resolvidas dependências.

Uso do arquivo de bloqueio

O lockfile pode ser controlado pela sinalização --lockfile_mode para personalizar o comportamento do Bazel quando o estado do projeto é diferente do o arquivo de bloqueio. Os modos disponíveis são:

  • update (padrão): se o estado do projeto corresponder ao arquivo de bloqueio, o o resultado da resolução é retornado imediatamente do arquivo de bloqueio. Caso contrário, é executada e o arquivo de bloqueio é atualizado para refletir o estado.
  • error: se o estado do projeto corresponder ao arquivo de bloqueio, o resultado da resolução será retornados do arquivo de bloqueio. Caso contrário, o Bazel gera um erro indicando que a variações entre o projeto e o arquivo de bloqueio. Esse modo é particularmente útil quando se quer garantir que as dependências do projeto permaneçam inalteradas e quaisquer diferenças são tratadas como erros.
  • off: o arquivo de bloqueio não é verificado.

Benefícios do Lockfile

O lockfile oferece vários benefícios e pode ser usado de várias maneiras:

  • Builds reproduzíveis. Capturando as versões ou dependências específicas de bibliotecas de software, o arquivo de bloqueio garante que os builds sejam reproduzíveis em diferentes ambientes e ao longo do tempo. Os desenvolvedores podem confiar resultados consistentes e previsíveis ao criar seus projetos.

  • Pular resolução eficiente. O arquivo de bloqueio permite que o Bazel ignore o processo de resolução se não houver mudanças nas dependências do projeto, já que ao último build. Isso melhora significativamente a eficiência do build, especialmente cenários em que a resolução pode ser demorada.

  • Estabilidade e redução de riscos. O arquivo de bloqueio ajuda a manter a estabilidade evitar atualizações inesperadas ou alterações interruptivas em bibliotecas externas. De o bloqueio das dependências a versões específicas, o risco de introduzir bugs devido a atualizações incompatíveis ou não testadas é reduzida.

Conteúdo do arquivo de bloqueio

O arquivo de bloqueio contém todas as informações necessárias para determinar se o o estado do projeto mudou. Também inclui o resultado da criação do projeto no estado atual. O arquivo de bloqueio consiste em duas partes principais:

  1. Entradas da resolução do módulo, como moduleFileHash, flags e localOverrideHashes, bem como a saída da resolução, que é moduleDepGraph.
  2. Para cada extensão de módulo, o arquivo de bloqueio inclui entradas que o afetam, representada por transitiveDigest e a saída da execução dessa extensão chamado de generatedRepoSpecs

Este é um exemplo que demonstra a estrutura do arquivo de bloqueio, juntamente com explicações para cada seção:

{
  "lockFileVersion": 1,
  "moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
  "flags": {
    "cmdRegistries": [
      "https://bcr.bazel.build/"
    ],
    "cmdModuleOverrides": {},
    "allowedYankedVersions": [],
    "envVarAllowedYankedVersions": "",
    "ignoreDevDependency": false,
    "directDependenciesMode": "WARNING",
    "compatibilityMode": "ERROR"
  },
  "localOverrideHashes": {
    "bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
  },
  "moduleDepGraph": {
    "<root>": {
      "name": "",
      "version": "",
      "executionPlatformsToRegister": [],
      "toolchainsToRegister": [],
      "extensionUsages": [
        {
          "extensionBzlFile": "extension.bzl",
          "extensionName": "lockfile_ext"
        }
      ],
      ...
    }
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
      "generatedRepoSpecs": {
        "hello": {
          "bzlFile": "@@//:extension.bzl",
          ...
        }
      }
    }
  }
}

Hash de arquivo do módulo

O moduleFileHash representa o hash do conteúdo do arquivo MODULE.bazel. Se qualquer alteração nesse arquivo, o valor de hash será diferente.

Sinalizações

O objeto Flags armazena todas as sinalizações que podem afetar o resultado da resolução.

Hashes de substituição local

Se o módulo raiz incluir local_path_overrides, esta seção armazenará o hash do arquivo MODULE.bazel no repositório local. Permite rastrear mudanças a essa dependência.

Gráfico de dependências do módulo

O moduleDepGraph representa o resultado do processo de resolução usando o as entradas mencionadas acima. Ele forma o gráfico de dependências de todos os módulos necessárias para executar o projeto.

Extensões do módulo

A seção moduleExtensions é um mapa que inclui apenas as extensões usadas na invocação atual ou invocadas anteriormente, excluindo qualquer extensão que não são mais utilizadas. Em outras palavras, se uma extensão não estiver sendo usada no gráfico de dependência, ele é removido do moduleExtensions mapa.

Cada entrada nesse mapa corresponde a uma extensão usada e é identificada por seu que contém o arquivo e o nome. O valor correspondente para cada entrada contém as informações relevantes associadas a essa extensão:

  1. transitiveDigest: o resumo da implementação da extensão e a respectiva arquivos .bzl transitivos.
  2. O generatedRepoSpecs é o resultado da execução dessa extensão com o a entrada atual.

Outro fator que pode afetar os resultados da extensão são os usos. Embora não sejam armazenados no arquivo de bloqueio, os usos são considerados na comparação o estado atual da extensão com o que está no arquivo de bloqueio.

Práticas recomendadas

Para maximizar os benefícios do recurso de bloqueio de arquivo, considere as seguintes práticas recomendadas:

  • Atualize regularmente o arquivo de bloqueio para refletir as alterações nas dependências do projeto ou configuração do Terraform. Isso garante que os próximos builds sejam baseados um conjunto atualizado e preciso de dependências.

  • Incluir o arquivo de bloqueio no controle de versões para facilitar a colaboração e garantir que todos os membros da equipe tenham acesso ao mesmo arquivo de bloqueio, promovendo ambientes de desenvolvimento consistentes em todo o projeto.

Seguindo estas práticas recomendadas, você pode utilizar o arquivo de bloqueio de forma eficaz do Bazel, o que aumenta a eficiência, a confiabilidade e a colaboração fluxos de trabalho de desenvolvimento de software.