Inspired by this SO question I wanted to use the same mechanism to embed a version number in my golang application. However I'm using the Cobra command line parser and want to have a version sub-command. This leads to the following directory and package structure:
.
|-- cmd
`-- version.go
|-- main.go
Up to now I have tried the following:
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
With version.go containing a variable declaration like:
var versionString string
and
var VersionString string
respectively.
I've also tried to put the variable declarations in main.go but then I'm not clear how to reference the variables in version.go for this option I tried:
import "github.com/basbossink/psiw"
....
fmt.Println(psiw.VersionString)
-
import "github.com/basbossink/psiw/main"
...
fmt.Println(main.VersionString)
In both cases the compiler complains that psiw and main respectively are unknown.
Note that using the VersionString in main gives the expected result.
I would prefer a solution where the link flags point to the variable in the version package since they don't require a back-pointer. But any suggestions are welcome.
Looking at the Hugo source I've discovered the answer to my question. The trick is to use:
So I made two mistakes:
version.gofile hadpackage cmdas it's package statement.