在Golang应用程序中,如何在除main之外的其他包中嵌入版本?
问题描述:
受this SO question的启发我想使用相同的机制在我的golang应用程序中嵌入版本号。但是,我使用的是Cobra命令行解析器,并且希望有一个version
子命令。这导致了下面的目录和包装结构:在Golang应用程序中,如何在除main之外的其他包中嵌入版本?
.
|-- 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)
-
在这两种情况下,编译器都会抱怨psiw
和main
分别是未知的。 请注意,使用main
中的VersionString
可获得预期结果。
我更喜欢一个解决方案,其链接标志指向version
包中的变量,因为它们不需要反指。但欢迎任何建议。
答
看着Hugo source我发现了我的问题的答案。诀窍是使用:
go run -ldflags "-X github.com/basbossink/psiw/cmd.versionString=0.1.0" main.go version
所以我犯了两个错误:
- 我混了包和源文件的概念,将
version.go
文件有package cmd
,因为它是包语句。 - 引用变量的方式是使用完全限定名称。