Bazel Lockfile

<ph type="x-smartling-placeholder"></ph> 报告问题 查看来源 敬上 每晚 · 7.3。 · 7.2 条 · 7.1敬上 · 7.0。 · 6.5

借助 Bazel 中的锁定文件功能,你可以记录特定版本或 项目所需的软件库或软件包的依赖项。它 通过将模块解析和扩展结果 评估。Lockfile 提升可重现的 build,确保一致性 开发环境此外,它还允许 Bazel,可在项目中没有任何更改时跳过解析过程 依赖项此外,锁文件可以防止 意外更新或外部库中的破坏性更改,从而减少 并降低引入错误的风险

生成锁定文件

系统会在工作区根目录下生成名为 MODULE.bazel.lock。它是在构建流程中创建或更新的 特别是在模块解析和扩展评估之后。Lockfile 捕获项目的当前状态,包括 MODULE 文件、标志、 替换内容和其他相关信息。重要的是 依赖项。

当项目中发生会影响其依赖项的更改时,Lockfile 会自动更新以反映新状态。这样可以确保锁定文件 仍然专注于当前所需要的特定依赖项集 准确反映项目的已解析状态 依赖项

锁定文件使用情况

锁文件可以通过 --lockfile_mode至 自定义 Bazel 在项目状态与 lockfile 中找到。可用的模式包括:

  • update(默认):如果项目状态与 lockfile 匹配,则 会立即从 lockfile 返回解析结果。否则 并更新锁定文件以反映当前的 状态。
  • error:如果项目状态与 lockfile 匹配,则解析结果为 。否则,Bazel 会抛出一个错误,指明 不同项目和 lockfile 的不同变体。这种模式 当您想要确保项目的依赖项仍然处于“有效”状态时 保持不变,任何差异均被视为错误。
  • off:根本不检查锁定文件。

Lockfile 的优势

锁定文件具有多种优势,可通过多种方式加以利用:

  • 可重现的 build。通过捕获特定版本或依赖项 锁定文件可确保 build 的可重现性 在不同环境中和长期的不同需求。开发者可以 获得一致且可预测的结果。

  • 高效跳过分辨率。通过锁定文件,Bazel 可以跳过 如果项目依赖项未发生任何更改, 上次构建时的情况。这显著提高了构建效率,尤其是在 在需要耗费大量时间的场景中。

  • 稳定性和降低风险。锁定文件有助于保持稳定性 防止外部库中发生意外更新或破坏性更改。修改者 将依赖项锁定为特定版本、引入 bug 的风险 会减少。

锁定文件内容

锁定文件包含所有必要信息,以确定 项目状态已更改。它还包括项目构建结果 这些对象在当前状态下的状态。lockfile 由两个主要部分组成:

  1. 模块分辨率的输入,例如 moduleFileHashflagslocalOverrideHashes,以及分辨率的输出, moduleDepGraph
  2. 对于每个模块扩展,锁定文件都包含影响它的输入, 由 transitiveDigest 表示,以及运行该扩展程序的输出 称为 generatedRepoSpecs

下面举例说明了锁定文件的结构 对每个部分的说明:

{
  "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",
          ...
        }
      }
    }
  }
}

模块文件哈希

moduleFileHash 表示 MODULE.bazel 文件内容的哈希值。如果 如果此文件发生任何更改,哈希值会有所不同。

标志

Flags 对象会存储可影响解析结果的所有标志。

本地替换哈希

如果根模块包含 local_path_overrides,此部分会存储哈希值 本地代码库中 MODULE.bazel 文件的名称。它允许跟踪更改 添加到此依赖项中。

模块依赖关系图

moduleDepGraph 表示使用 上述输入。它构成了所有模块的依赖关系图 运行项目所需的资源

模块扩展

moduleExtensions 部分是一个仅包含所使用的扩展程序的地图 在当前调用中或之前调用中,同时排除所有扩展 不再使用的。也就是说,如果扩展程序未被使用 之后就会从 moduleExtensions 中移除 地图。

此映射中的每个条目都对应一个已使用的扩展名,并由其 包含文件名和文件名。每个条目对应的值都包含 相关信息:

  1. transitiveDigest 是扩展程序实现及其 传递 .bzl 文件。
  2. generatedRepoSpecs:使用 当前输入。

另一个可能影响扩展程序结果的因素是其使用情况。 虽然没有存储在锁定文件中,但比较时会将这些用例 扩展程序的当前状态与 Lockfile 中的项相同。

最佳做法

为了最大限度地发挥 Lockfile 功能的优势,请考虑以下最佳做法 做法:

  • 定期更新锁定文件,以反映项目依赖项中的更改,或 配置。这样可确保后续构建基于 一组最新、准确的依赖项。

  • 将锁文件包含在版本控制中,以促进协作和 确保所有团队成员都有权访问同一个锁文件,从而提升 在整个项目中保持一致的开发环境。

通过遵循这些最佳实践,您可以有效利用 Lockfile 功能,从而提升效率、可靠性和协作性 软件开发工作流。