在Golang应用程序中,如何将版本嵌入除main之外的其他软件包中?

Bas*_*ink 1 version auto-versioning go

这个SO问题的启发,我想使用相同的机制在我的golang应用程序中嵌入版本号。但是我正在使用Cobra命令行解析器,并希望有一个version子命令。这将导致以下目录和包结构:

.
|-- cmd                                                                   
`-- version.go                                                    
|-- main.go                                                           
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试了以下方法:

go run -ldflags "-X cmd/version.versionString=0.1.0" main.go version
Run Code Online (Sandbox Code Playgroud)

--

go run -ldflags "-X version.versionString=0.1.0" main.go version
Run Code Online (Sandbox Code Playgroud)

--

go run -ldflags "-X version.VersionString=0.1.0" main.go version
Run Code Online (Sandbox Code Playgroud)

随着version.go包含像这样的变量声明:

var versionString string
Run Code Online (Sandbox Code Playgroud)

var VersionString string
Run Code Online (Sandbox Code Playgroud)

分别。

我也尝试过将变量声明放进去,main.go但是我不清楚如何为version.go我尝试过的这个选项引用变量:

import "github.com/basbossink/psiw"
....
fmt.Println(psiw.VersionString)
Run Code Online (Sandbox Code Playgroud)

--

import "github.com/basbossink/psiw/main"
...
fmt.Println(main.VersionString)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,编译器都会抱怨psiwmain分别未知。请注意,使用VersionStringin main将提供预期的结果。

我更喜欢一种解决方案,其中链接标志指向version程序包中的变量,因为它们不需要反向指针。但是任何建议都欢迎。

Bas*_*ink 5

通过查看雨果的资料,我找到了问题的答案。诀窍是使用:

go run -ldflags "-X github.com/basbossink/psiw/cmd.versionString=0.1.0" main.go version
Run Code Online (Sandbox Code Playgroud)

所以我犯了两个错误:

  • 我混合了包和源文件的概念,该version.go文件具有package cmd包声明的含义。
  • 引用变量的方法是使用完全限定的名称。