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

2023-11-23

我正在编写两个二进制文件,它们都使用两个库(我们可以称它们为 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(使用前将#替换为@)

Golang - 如何从代码内部显示模块版本 的相关文章

随机推荐

  • 保证金最高百分比是如何计算的?

    我知道这应该很简单 但是任何人都可以告诉我为什么下面的子框在以下情况下会溢出其父级的容器 margin top 50 应用于孩子身上 保证金最高百分比是如何计算的 container background lightblue padding
  • 正确使用 HTTP 错误代码。 550 - 为什么是 5xx 而不是 4xx?

    今天 当用户没有权限时 一位同事在删除操作中使用了 550 错误 乍一看这对我来说很糟糕 因为据我所知 这种错误对我来说看起来像是客户端 又名 4xx 错误而不是服务器 又名 5xx 当查看描述时 它完全表明它被正确使用 而不是 401 错
  • 使用 HTML5 Canvas 进行图像处理和纹理映射?

    在我正在开发的 3D 引擎中 我成功地绘制了 3D 立方体 就我而言 填充侧面的唯一方法是使用纯色或渐变 为了让事情变得更令人兴奋 我真的很想使用简单的位图来实现纹理映射 关键是我几乎找不到任何关于 JavaScript 图像处理主题的文章
  • Python 使用“quoted-printable”传输编码和“utf-8”内容编码发送电子邮件

    蟒蛇的email mime倾向于使用编码base64 or 7bit and us ascii 我想用quoted printable and utf 8因为这对于人类来说更容易阅读和调试 目前 我的电子邮件看起来像 61353500484
  • Python setup.py 调用 makefile 不包含二进制文件

    一些上下文 我有一些 C 代码 编译后我可以在终端中调用 如下所示 my excec params它生成一些我在 python 中使用的文件来生成图表和其他内容 我想将所有内容打包到 python 库中 包括 C 代码和 python 代码
  • 将事件处理程序添加到新创建的元素

    我正在尝试将新元素添加到有序列表中 并带有删除链接 list ol append li label a href remove a li 但这不起作用 a href remove on click function event alert
  • Stripe Webhook 错误:未找到与负载的预期签名匹配的签名

    我正在使用 Stripe 提供的代码来测试 webhook Stripe 机密和端点机密已经过三次检查 条纹版本 6 19 正文解析器 1 19 当我在 Stripe 仪表板上测试 webhook 时 得到结果 Test webhook e
  • 如何在 Swift 中实现 AudioServicesSystemSoundCompletionProc?

    我正在尝试在 Xcode 中使用 Swift 为 AudioServicesAddSystemSoundCompletion 中的参数创建 AudioServicesSystemSoundCompletionProc 的实例 但失败了 这是
  • Android 以编程方式配对后自动连接蓝牙设备

    在我的应用程序中 我需要配对蓝牙设备并立即与其连接 我有以下功能来配对设备 public boolean createBond BluetoothDevice btDevice try Log d pairDevice Start Pair
  • Margin-top: 100% 获取父宽度值...奇怪

    我在大多数浏览器 即 ff chrome safari 上遇到了非常奇怪的 问题 这是示例代码
  • Android 重试 onErrorResponse 请求

    当我收到错误时错误响应android volley 请求我想重试该请求 我怎样才能做到这一点 好吧 你可以创建RetryPolicy要更改默认重试行为 只需指定timeout milliseconds retry count论据 publi
  • XPath 选择内部文本

    我有这个 HTML XML t t t t t r n t t a href test aspx span class test b blabla b span a br this is the text I want br span cl
  • Clock_getres 的使用 - Linux C 新手

    我正在尝试确定 Linux 机器上计时器的粒度 根据clock getres的手册页 我应该能够使用这个片段 include
  • Excel - VBA:将变量从子传递到用户窗体

    我已阅读并应用了在类似主题上找到的解决方案 但似乎对我的情况没有任何作用 因此 我想将一个变量从 Module1 的一个子模块传递到用户窗体 这是一个名为 provinceSugg 的字符串 这是我的代码的相关部分 Public provi
  • 在二维数组中创建相似元素集

    我正在尝试解决基于二维数组的问题 该数组包含不同类型的元素 总共 3 种可能的类型 让我们假设类型为 X Y Z 该数组看起来是这样的 请注意 它总是被完全填满 该图仅供说明之用 7 6 5 4 X Z Y X 3 Y X Y Y X 2
  • 什么是好的Jsp IDE

    我是一名 C 开发人员 但有一份涉及一些 jsp 代码的工作 我一直在使用记事本 它在突出显示方面做得很好 但我缺少智能感知 并且发现很难找到我需要的方法 对于喜欢 C 并具有智能感知功能的人来说 什么是好的 jsp IDE Update
  • 在 bash 无限循环期间禁用用户输入

    我有这个 bash 脚本 它基本上启动带有进度指示器的 Web 和 selenium 服务器 由于硒服务器启动需要一些时间 我正在无限循环中检查状态 问题是 在等待它启动时 我不小心按下了按键 它会显示在屏幕上 如果循环结束 超时 它也会显
  • C# 中的 HTTP 代理服务器

    我的公司正在尝试使用 NET Fx 3 5 和 C 编写代理服务器 来自我们的research我读到 HttpListener 不是代理服务器的良好候选者 尽管我不确定为什么 我们目前正在与Mentalis代理示例源代码尽管这将涉及到实现我
  • 如何在屏幕之间切换?

    我是 Android 开发世界的新手 我创建了简单的应用程序 并通过一个按钮创建了一个简单的 GUI 如果用户按下此按钮 我想更改屏幕以显示其他 GUI 我怎样才能做到这一点 你可以这样做 import android view View
  • Golang - 如何从代码内部显示模块版本

    我正在编写两个二进制文件 它们都使用两个库 我们可以称它们为 libA 和 libB 每个库都位于专用的 git 存储库中 并使用 git 标签来声明版本 例如 libA 的版本为 v1 0 9 libB 的版本为 v0 0 12 两个二进