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

时间:2016-02-10 23:49:54

标签: go version auto-versioning

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

.
|-- cmd                                                                   
`-- version.go                                                    
|-- main.go                                                           

到目前为止,我已经尝试了以下内容:

go run -ldflags "-X cmd/version.versionString=0.1.0" main.go version

-

go run -ldflags "-X version.versionString=0.1.0" main.go version

-

go run -ldflags "-X version.VersionString=0.1.0" main.go version

version.go包含变量声明,如:

var versionString string

var VersionString string

分别

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

import "github.com/basbossink/psiw"
....
fmt.Println(psiw.VersionString)

-

import "github.com/basbossink/psiw/main"
...
fmt.Println(main.VersionString)

在这两种情况下,编译器都抱怨psiwmain分别是未知的。 请注意,使用VersionString中的main会得到预期的结果。

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

1 个答案:

答案 0 :(得分:5)

Hugo source我发现了问题的答案。诀窍是使用:

go run -ldflags "-X github.com/basbossink/psiw/cmd.versionString=0.1.0" main.go version

所以我犯了两个错误:

  • 我混淆了包和源文件的概念,version.go文件有package cmd作为它的包语句。
  • 引用变量的方法是使用完全限定名称。