In a Golang application, how to embed a version in a other package than main?

2.4k views Asked by At

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.

1

There are 1 answers

0
Bas Bossink On

Looking at the Hugo source I've discovered the answer to my question. The trick is to use:

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

So I made two mistakes:

  • I mixed up the notion of package and source file, the version.go file had package cmd as it's package statement.
  • The way to reference the variable is to use the fully qualified name.