Bazel是否支持缓存编译与测试失败结果?
好问题!你提到的这个痛点确实在大型代码库中很常见——Bazel默认只缓存成功的构建/测试结果,失败的任务会重复执行,白白浪费时间。不过幸运的是,Bazel其实支持缓存失败的构建和测试结果,只需要简单配置就能开启这个功能。
如何开启失败结果缓存
你可以通过两种方式来启用这个特性:
1. 命令行临时启用
每次运行Bazel命令时,加上--cache_failed_actions参数即可。比如:
- 构建时:
bazel build --cache_failed_actions //... - 测试时:
bazel test --cache_failed_actions //...:all
这个参数会让Bazel把失败的动作(不管是编译还是测试)的结果缓存起来,当后续执行相同的任务(输入和依赖完全没变)时,直接返回之前的失败结果,不会重新执行。
2. 配置文件永久启用
如果你不想每次都加命令行参数,可以把这个配置写到项目根目录的.bazelrc文件里,这样所有Bazel命令都会自动生效:
build --cache_failed_actions test --cache_failed_actions
针对你场景的效果验证
比如你说的测试场景:100个测试里4个失败,修复其中一个后重新跑bazel test //...:all——开启失败缓存后,另外3个没有修改依赖的失败测试,Bazel会直接读取缓存的失败结果,不会再重新执行,你只需要等待修复后的那个测试跑完就行,时间直接节省一大半。
编译场景同理:如果某次构建因为特定文件的错误失败,只要你没修改相关文件,重新构建时Bazel会直接返回缓存的失败结果,不会再花几分钟重复执行那次失败的编译。
注意事项
- 这个缓存是基于输入和依赖的哈希值的,只要你的代码、依赖或者构建配置有任何变化,Bazel就会重新执行任务,不会误用旧的失败缓存。
- 失败缓存和成功缓存共用Bazel的缓存系统,不管是本地缓存还是远程缓存,都能支持这个特性。
内容的提问来源于stack exchange,提问作者rabensky
相关产品推荐
相关产品推荐

