【问题标题】:Golang - How to display modules version from inside of codeGolang - 如何从代码内部显示模块版本
【发布时间】:2020-09-12 11:54:14
【问题描述】:

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

每个库都在一个专用的 git repo 中,带有 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 go-modules


    【解决方案1】:

    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?

    【讨论】:

    • 据我了解,这意味着要使用调试信息构建二进制文件,我不知道这究竟是什么意思。是否有任何安全/保密影响?
    • @Sébastien 这只需要构建模块支持,没有别的。
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2020-04-21
    相关资源
    最近更新 更多