gpt4 book ai didi

Golang - 如何从代码内部显示模块版本

转载 作者:行者123 更新时间:2023-12-01 21:13:42 24 4
gpt4 key购买 nike

我正在编写两个二进制文件,它们都使用两个库(我们可以称它们为 libA 和 libB)。

每个库都在一个专用的 git 存储库中,带有 git-tags 来声明版本。
例如,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() 获取它。它会返回一个依赖项列表,包括模块路径和版本。每个模块/依赖项由 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)
}
}

此输出(在 Go Playground 上尝试):
Dep: &{Path:github.com/icza/bitio Version:v1.0.0 Sum:h1:squ/m1SHyFeCA6+6Gyol1AxV9nmPPlJFT8c2vKdj3U8= Replace:<nil>}

另见相关问题: How to get Go detailed build logs, with all used packages in GOPATH and "go module" mode?

关于Golang - 如何从代码内部显示模块版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62009264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com