关于go build -buildvcs无法同时嵌入Deps与vcs.revision的咨询
Go Build 同时嵌入Deps与VCS版本信息的问题及解决
问题背景
使用go version go1.18.4 linux/amd64,项目目录结构如下:
go.mod cmd/exe1/main.go cmd/exe2/main.go pkg/pkg1/... pkg/pkg2/...
两种构建场景出现的差异:
- 场景1:在项目根目录执行
go build -buildvcs=true -o /tmp/exe1 cmd/exe1/main.go- 生成的可执行文件BuildInfo包含所有依赖的
Deps条目,但没有vcs.revision设置,模块版本显示为(devel)
- 生成的可执行文件BuildInfo包含所有依赖的
- 场景2:进入
project/cmd/exe1目录执行go build -buildvcs=true -o /tmp/exe1- 生成的可执行文件BuildInfo包含
vcs.revision,但缺失Deps条目
- 生成的可执行文件BuildInfo包含
用户疑问:
- 能否同时将
Deps和vcs.revision嵌入BuildInfo? - 当前目录结构是否合规?
- 这种构建行为是否符合预期?
- 求推荐相关全面指南的查阅途径
解决方案与说明
1. 同时嵌入Deps与vcs.revision的方法
在项目根目录执行模块模式下的构建命令,指定包路径而非单个文件:
cd project go build -buildvcs=true -o /tmp/exe1 ./cmd/exe1
直接指定单个.go文件会触发文件模式构建,Go不会将其视为模块内的包,因此无法识别VCS仓库信息;而指定包路径会以模块模式构建,既会保留完整的依赖Deps,也会正确嵌入VCS版本信息。
2. 目录结构合规性
你的目录结构完全符合Go官方推荐的项目布局规范:
- 根目录存放
go.mod作为模块入口 cmd/目录下存放各个可执行程序的主包pkg/目录下存放可复用的库包
3. 构建行为的合理性
这种差异是Go构建系统的设计预期:
- 文件模式构建(指定单个
.go文件):仅编译指定文件,不关联模块上下文,因此不会读取VCS信息,也不会完整收集依赖Deps - 模块模式构建(指定包路径):基于模块上下文编译,会遍历所有依赖并读取VCS仓库信息,因此能同时生成完整的
Deps和vcs.revision
4. 官方指南查阅途径
- 终端执行
go help modules,查看模块构建的核心规则 - 终端执行
go help build,了解go build的两种模式及行为差异 - 参考Go官网的项目布局推荐文档,获取标准化项目结构的详细说明
内容的提问来源于stack exchange,提问作者user18911088
相关产品推荐
相关产品推荐

