为什么Google's Bazel强制重建C ++是出于与代码无关的原因,例如重启系统或更改无线网络?即使代码没有改变,代码也会重建。在其他一些(劣质?)构建系统中,无线网络不会影响依赖图。
问另一种方式:在构建代码之前,所有构建系统(例如Microsoft Visual Studio)是否还要检查无线网络和机器的正常运行时间?
问第三种方式:在依赖图中应该考虑哪些其他环境因素?防病毒签名?谷歌浏览器的版本?您上次收到Facebook消息?
答案 0 :(得分:4)
如果能够证明重复使用以前的结果是安全的,那么Bazel会有很多事情可以保守地重建软件。
首先,这些是1)声明为操作的输入的文件(这可以包括编译器等工具),2)使用的命令行,以及3)传递给操作的环境变量。
Bazel目前默认将本地计算机中的一些环境变量转发到所有操作,包括PATH,LD_LIBRARY_PATH和TMPDIR - 这是一个错误(请参阅https://github.com/bazelbuild/bazel/issues/2574)。
此外,Bazel支持' stamping&#39 ;,它将用户名,主机名和当前时间等信息嵌入到二进制文件中。默认情况下,对构建期间使用的二进制文件禁用标记 - 这些标记是为我们称之为“主机配置”的内容构建的。
可能出现的问题:
如果更改无线网络,PATH,LD_LIBRARY_PATH或TMPDIR似乎不太可能发生变化,但您可能想检查是否属于这种情况。
您的Bazel构建版本可能配置为从本地计算机获取一些环境变量并将其转发给操作。每当env变量发生变化时,Bazel都会重建依赖它的每个动作。如果将--action_env = VARIABLE传递给Bazel,则会发生这种情况。
在Mac计算机上,主机名可能会根据网络连接而改变。这里可能发生的是你在构建过程中使用了一个工具,并且在启用了冲压的情况下意外构建,并且你的主机名发生了变化,因此Bazel重建了这个工具,这会使大量的下游操作中毒,因为该工具是不同(即使它只是几个字节)。
Bazel的用户界面也很容易让人感到困惑。如果您重新启动计算机(或关闭Bazel守护程序),则Bazel将执行所有操作以检查它们是否已高速缓存命中,但可能无法正确说明。你可以通过检查Bazel需要多长时间来解决这个问题 - 如果它只有几秒钟,那么它实际上不太可能执行任何事情。如果是这种情况,那么我们想知道这一点,以便我们可以优先考虑这方面的改进。
编辑:还有可能在Bazel中发现了一个实际的错误,例如Bazel在某种程度上是非确定性的,并且由于当前密钥与先前条目不完全匹配而导致缓存未命中。
答案 1 :(得分:0)
这只是偏执狂。重新启动或更改无线网络可能会导致系统时间更新到比上次构建更早的时间。这可能会导致事情无法重建,因此需要采用更安全(更长)的方式重建所有事情。