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:
- Entradas da resolução do módulo, como
moduleFileHash
,flags
elocalOverrideHashes
, bem como a saída da resolução, que émoduleDepGraph
. - 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 degeneratedRepoSpecs
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:
transitiveDigest
: o resumo da implementação da extensão e a respectiva arquivos .bzl transitivos.- 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.