如何列出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构建动作:
- 生成构建Profile:
bazel build //... --profile=build_profile.txt
- 解析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
相关产品推荐
相关产品推荐

