执行“go get path/to/myapp”时,我可以获得正确的版本和构建信息吗?

Posted

技术标签:

【中文标题】执行“go get path/to/myapp”时,我可以获得正确的版本和构建信息吗?【英文标题】:Can I get correct version and build info when doing "go get path/to/myapp"? 【发布时间】:2020-01-06 11:44:23 【问题描述】:

我需要在 Go 应用生成的输出中提供版本号。 对于发布和本地构建,我使用具有以下内容的 Makefile:

...
VERSION = $(shell git describe --tags)
VER = $(shell git describe --tags --abbrev=0)
DATE = $(shell date -u '+%Y-%m-%d_%H:%M:%S%Z')
...
FLAGS_LD=-ldflags "-X path/to/myapp/mypkg.Build=$DATE \
                  -X path/to/myapp/mypkg.Version=$VERSION"
...
GOCMD = go
GOBUILD = $(GOCMD) build $(FLAGS_LD)
GOINSTALL = $(GOCMD) install $(FLAGS_LD)
...

在包中我有变量

package mypkg

var (
    Version = "v0.11.0-dev"
    Build   string
)

当我通过 make 运行构建、安装或发布时一切都很好,但是如果我运行 go get path/to/myapp 然后 -ldflags 为空,用户获取过时的版本信息,并且 没有构建信息。

在使用go get 安装程序时,有没有办法获得正确的 ldflags 数据?

【问题讨论】:

【参考方案1】:

不,下载源时不能读/写 ldflags

go get 旨在从源安装。

有没有办法在使用 go get 安装程序时获取正确的 ldflags 数据?

目前的回答是否定的。

是的,您可以为您的用户提供您的软件包版本

实现您想要做的最简单的方法是:

    如果您要共享的是 lib(可重用代码),请将 git 标记添加到您的源代码库,以便您的开发用户可以将其用于包版本管理。 (glide, go.mod, dep, ...)。

    如果您要共享的是一个程序(仅用于编译和执行),请在每次发布新版本时修改Version 的值。结合使用git-hookssed,您可以非常轻松地自动执行此操作。

【讨论】:

【参考方案2】:

有没有办法在使用 go get 安装程序时获取正确的 ldflags 数据?

没有。

【讨论】:

以上是关于执行“go get path/to/myapp”时,我可以获得正确的版本和构建信息吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 执行时

小记---------手动执行脚本正常执行,使用crontab定时执行时 不执行

uniapp页面显示时执行

为啥老是“执行 cl.exe 时出错”

Pyspark,执行者在执行连接时失去连接

如何在 Linux 启动时自动执行命令或脚本