Do you know that, It is possible to inject values to variables at build on Golang?
Let’s assume that you are building a command-line tool and you want to inject the latest build/commit hash to your application. Maybe you are building a rest API service and you want to add a deployed commit hash to your health check endpoint to see which build is running.
You have a package called version
package version
// CommitHash represents current build/commit hash.
var CommitHash string
Now build your project. Now we’ll use nm
tool to find out symbols defined or used by an object file, archive, or executable. You can find more details about nm
via go doc cmd/nm
.
$ go build
$ go tool nm ./yourEXE | grep CommitHash
100444070 B github.com/YOURNAME/YOURAPP/app/version.CommitHash # just an example output
Grab the full name; github.com/YOURNAME/YOURAPP/app/version.CommitHash
and
go build -ldflags="-X 'github.com/YOURNAME/YOURAPP/app/version.CommitHash=$(git rev-parse HEAD)'"
Now the latest commit hash value is injected to version.CommitHash
. This bash command git rev-parse HEAD
returns the hash. This is just a string :)
You can inject whatever you want;
go build -ldflags="-X 'github.com/YOURNAME/YOURAPP/app/version.CommitHash=hello'"
If you check go help build
you’ll see;
-ldflags '[pattern=]arg list'
arguments to pass on each go tool link invocation.
That’s it!
The original article can be found here.