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.go
file hadpackage cmd
as it's package statement.