1

这个 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分别是未知的。请注意,使用VersionStringinmain给出了预期的结果。

我更喜欢链接标志指向包中的变量的解决方案,version因为它们不需要back-pointer。但欢迎提出任何建议。

4

1 回答 1

6

查看Hugo 的源代码,我发现了我的问题的答案。诀窍是使用:

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

所以我犯了两个错误:

  • 我将包和源文件的概念混为一谈,该version.go文件具有package cmd包声明。
  • 引用变量的方法是使用完全限定名。
于 2016-02-11T00:49:46.340 回答