跳转到内容

哈希

缓存或选择性测试执行等功能需要一种方法来确定 target 是否发生了变化。Tuist 为依赖图中的每个 target 计算哈希值,以确定 target 是否发生了变化。哈希基于以下属性计算:

  • Target 的属性(例如名称、平台、产品等)
  • Target 的文件
  • Target 依赖的哈希值

此外,在计算缓存的哈希时,我们还会哈希以下属性。

我们哈希从运行命令 /usr/bin/xcrun swift --version 获取的 Swift 版本,以防止因 Swift 版本与 target 和二进制文件不匹配而导致的编译错误。

::: info 模块稳定性 以前版本的二进制缓存依赖 BUILD_LIBRARY_FOR_DISTRIBUTION 构建设置来启用模块稳定性,并启用与任何编译器版本一起使用二进制文件。但是,这会导致不支持模块稳定性的 target 的项目出现编译问题。生成的二进制文件绑定到用于编译它们的 Swift 版本,并且 Swift 版本必须与用于编译项目的版本一致。 :::

-configuration 标志背后的想法是确保调试二进制文件不用于发布构建,反之亦然。但是,我们仍然缺少一种机制来从项目中删除其他配置以防止它们被使用。

如果你在使用缓存时注意到跨环境或调用的非确定性行为,这可能与环境之间的差异或哈希逻辑中的 bug 有关。我们建议按照以下步骤来调试问题:

  1. 运行 tuist hash cachetuist hash selective-testing(为二进制缓存选择性测试计算哈希),复制哈希值,重命名项目目录,然后再次运行命令。哈希值应该匹配。
  2. 如果哈希值不匹配,可能是生成的项目依赖于环境。分别在两种情况下运行 tuist graph --format json 并比较图。或者,生成项目并使用 Diffchecker 等 diff 工具比较它们的 project.pbxproj 文件。
  3. 如果哈希值相同但在不同的环境中不同(例如 CI 和本地),请确保在各处使用相同的配置Swift 版本。Swift 版本与 Xcode 版本绑定,因此请确认 Xcode 版本匹配。

如果哈希值仍然是非确定性的,请告诉我们,我们可以帮助调试。

::: info 计划改进调试体验 改进我们的调试体验已在路线图中。print-hashes 命令缺乏理解差异的上下文,将被一个更友好的命令取代,该命令使用类似树的结构来显示哈希值之间的差异。 :::