macOS M2下Bazel生成Go项目覆盖率报告为空的问题求助
核心问题分析
ARM64 架构适配冲突
你当前使用的是darwin/amd64版本的 Go,和 M2 的 ARM64 原生架构不匹配。Bazel 6.x 在跨架构环境下收集 Go 覆盖率时,会出现数据丢失的情况,这和你提到的 Issue #16515 记录的问题完全吻合——混合架构导致覆盖率数据无法被正确捕获和写入文件。Bazel 6.1.1 的已知覆盖率合并 Bug
你提到的 Issue #7719、#15254 都指向 Bazel 6.x 版本中--combined_report=lcov参数的逻辑缺陷:当测试项目结构简单(比如单包)时,覆盖率合并流程会出现静默失败,最终生成空的_coverage_report.dat文件。这个问题在 Bazel 6.3.0 及后续版本中已经被修复。示例仓库配置缺失
你使用的bazel-golang-minimal-example仓库缺少两个关键配置:
go_test规则未显式关闭 race 检测(ARM64 下 race 检测与覆盖率收集存在冲突)- 未启用 Go 工具链自动分辨率,导致 Bazel 可能调用不匹配架构的工具链
可执行的修复步骤
切换匹配架构的 Go 版本
卸载当前的darwin/amd64版 Go,安装对应darwin/arm64架构的 Go 1.20.2,确保本地工具链和 M2 架构完全匹配。修改覆盖率收集命令
放弃直接使用--combined_report=lcov,改用分步收集+手动合并的方式:
# 第一步:收集覆盖率数据 bazel coverage //... --nocache_test_results # 第二步:手动合并生成lcov格式报告 bazel run @bazel_tools//tools/test/CoverageOutputGenerator/combined_report -- --format=lcov --coverage_dir=$(bazel info output_path)/_coverage --output_file=coverage.dat
升级 Bazel 版本
将 Bazel 升级到 6.3.0 或更高版本,新版本修复了多个导致覆盖率报告为空的底层逻辑问题。补全示例仓库配置
在项目的.bazelrc中添加:
build --incompatible_enable_go_toolchain_resolution
同时修改BUILD.bazel中的go_test规则,添加race = False参数:
go_test( name = "hello_test", srcs = ["hello_test.go"], embed = [":hello"], race = False, )
内容的提问来源于stack exchange,提问作者jojo

