You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何列出bazel build //...后实际构建的产物(排除缓存命中项)

如何在Bazel构建Go二进制后列出实际构建的产物(排除缓存命中项)

以下是几种实用的方法,帮你过滤出真正被重新构建的Go产物,排除缓存中直接复用的内容:

方法1:直接过滤构建日志

Bazel构建时,实际执行编译/链接动作的目标会输出明确的日志,而缓存命中的目标只会显示"Up-to-date"或"Cached"。你可以通过日志过滤快速拿到产物路径:

# 只提取Go二进制的链接产物(可执行文件)
bazel build //... 2>&1 | grep "Linking.*bazel-bin" | awk '{print $NF}'

# 如果需要包含编译的静态库(.a文件),可以加上编译日志的过滤
bazel build //... 2>&1 | grep -E "(Linking|Compiling).*bazel-bin" | awk '{print $NF}'

方法2:通过构建Profile解析

使用Bazel的--profile参数生成构建过程的详细报告,然后从中筛选实际执行的Go构建动作:

  1. 生成构建Profile:
bazel build //... --profile=build_profile.txt
  1. 解析Profile,提取实际执行的Go产物:
# 筛选实际执行的Go链接动作(对应二进制可执行文件)
awk '/action.*GoLink/ && /executed/ {for(i=1;i<=NF;i++) if($i ~ /bazel-bin/) print $i}' build_profile.txt

# 若需要包含编译的包文件,替换为GoCompile
awk '/action.*GoCompile/ && /executed/ {for(i=1;i<=NF;i++) if($i ~ /bazel-bin/) print $i}' build_profile.txt

方法3:通过--subcommands查看执行的命令

--subcommands参数会让Bazel输出所有实际执行的构建命令,缓存命中的动作不会被列出,直接过滤Go相关命令即可:

# 提取Go二进制链接产物
bazel build //... --subcommands 2>&1 | grep "go_link" | awk '{print $NF}'

# 提取编译的包文件
bazel build //... --subcommands 2>&1 | grep "go_compile" | awk '{print $NF}'

这些方法各有侧重:日志过滤最快捷,Profile解析适合深度分析构建过程,--subcommands则能直接对应到执行的构建命令。根据你的需求选择即可。

内容的提问来源于stack exchange,提问作者Pedro Custódio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:25:17