在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) 

-

​​

在这两种情况下,编译器都会抱怨psiwmain分别是未知的。 请注意,使用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,因为它是包语句。
  • 引用变量的方式是使用完全限定名称。