为什么 Google's Bazel 会出于与代码无关的原因(例如重新启动系统或更改无线网络)强制重建 C++?即使代码没有改变,代码也会被重建。在其他一些(较差的?)构建系统中,无线网络不会影响依赖图。

换个方式问:是否所有构建系统,比如Microsoft Visual Studio,在构建代码之前也要检查无线网络和机器的正常运行时间吗?

以第三种方式提问:在依赖图中还应该考虑哪些其他环境因素?防病毒签名?谷歌浏览器版本?您上次收到 Facebook 消息是什么时候?

最佳答案

如果不能证明重用以前的结果是安全的,那么有很多事情会导致 Bazel 保守地重建软件。

这些主要是 1) 声明为 Action 输入的文件(这可以包括编译器等工具),2) 使用的命令行,以及 3) 传递给 Action 的环境变量。

Bazel 当前默认将一些环境变量从您的本地机器转发到所有操作,包括 PATH、LD_LIBRARY_PATH 和 TMPDIR - 这是一个错误(请参阅 https://github.com/bazelbuild/bazel/issues/2574 )。

此外,Bazel 支持“标记”,它将用户名、主机名和当前时间等信息嵌入到二进制文件中。默认情况下,对构建期间使用的二进制文件禁用标记 - 这些是为我们所谓的“主机配置”构建的。

可能出错的事情:

  • 如果您更改无线网络,PATH、LD_LIBRARY_PATH 或 TMPDIR 似乎不太可能更改,但您可能需要检查是否是这种情况。
  • 您的 Bazel 构建可能被配置为从本地机器获取一些环境变量并将其转发给操作。每当环境变量发生变化时,Bazel 都会重建依赖于它的每个操作。如果将 --action_env=VARIABLE 传递给 Bazel,就会发生这种情况。
  • 在 Mac 机器上,主机名可以根据网络连接而改变。这里可能发生的情况是,您在构建过程中使用了一个工具,并且它是在启用了标记的情况下意外构建的,并且您的主机名发生了变化,因此 Bazel 重建了该工具,这会毒化大量下游操作,因为该工具不同(即使它只是几个字节)。
  • 还可能发生的是 Bazel 的 UI 令人困惑。如果您重新启动机器(或关闭 Bazel 守护程序),则 Bazel 会执行所有操作以检查它们是否是缓存命中,但可能没有正确说明。您可以通过检查 Bazel 花费的时间来排除这种情况——如果它只有几秒钟,那么它实际上不太可能执行任何操作。如果这里是这种情况,那么我们想知道这一点,以便我们可以优先考虑该领域的改进。

  • 编辑:您也有可能在 Bazel 中发现了一个实际错误,例如 Bazel 在某些方面是不确定的,并且由于当前键与前一个条目不完全匹配而导致缓存未命中。

    关于c++ - 为什么在重新启动或更改无线网络后 Bazel 会重建?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46674110/

    10-16 17:17