我正在编写两个二进制文件,它们都使用两个库(我们可以称它们为 libA 和 libB)。
每个库都位于专用的 git 存储库中,并使用 git 标签来声明版本。
例如,libA 的版本为 v1.0.9,libB 的版本为 v0.0.12。
两个二进制文件都有 CLI 标志,我想添加一个调试标志来显示 lib 版本,如下所示:
> ./prog -d
Used libraries:
- libA, v1.0.9
- libB, v0.0.12
我不知道该怎么做。
我看到从“外部”设置变量的唯一方法是使用 ldflags (go build -ldflags="-X 'main.Version=v1.0.0'"
例如)。但这种方式似乎不可扩展,如何添加libC?它还意味着管理标签两次,一次在 git 中,一次在 goreleaser.yml 或 makefile 中。
你能帮我找到解决方案吗?
Go 工具在可执行二进制文件中包含模块和依赖项信息。您可以使用runtime/debug.ReadBuildInfo()来获取它。它会返回依赖项列表,包括模块路径和版本。每个模块/依赖项都由 type 的值描述debug.Module其中包含这些信息:
type Module struct {
Path string // module path
Version string // module version
Sum string // checksum
Replace *Module // replaced by this module
}
例如:
package main
import (
"fmt"
"log"
"runtime/debug"
"github.com/icza/bitio"
)
func main() {
_ = bitio.NewReader
bi, ok := debug.ReadBuildInfo()
if !ok {
log.Printf("Failed to read build info")
return
}
for _, dep := range bi.Deps {
fmt.Printf("Dep: %+v\n", dep)
}
}
这个输出(尝试一下去游乐场):
Dep: &{Path:github.com/icza/bitio Version:v1.0.0 Sum:h1:squ/m1SHyFeCA6+6Gyol1AxV9nmPPlJFT8c2vKdj3U8= Replace:<nil>}
另请参阅相关问题:如何获取 Go 详细的构建日志,以及 GOPATH 和“go module”模式下所有使用的包?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)