Intro #
Want app to show its version? Here's how.
Git tags are like labels for code versions. ldflags are special instructions for Go builder.
I like git tags as a single source of version the app. Based on them I run builds and releases. To add same version to Go app in automated way we can use ldflags.
Add one variable on build time #
- Create file
main.gowith content
package main
import "fmt"
var version = "dev"
func main() {
fmt.Println("Version:\t", version)
}- To your build script add
-ldflagswheremain.versionis package and var from code above.
go build -ldflags "-X main.version=$(git describe --abbrev=0 --tags)"Add multiple variables on build time #
Adding multiple variables on build time is as simple as follow.
- Edit
main.goand addbuildTimevariable
package main
import "fmt"
var (
version = "dev"
buildTime = "devTime"
)
func main() {
fmt.Println("Version:\t", version)
fmt.Println("Build time:\t", buildTime)
}- Edit
-ldfalgsby adding another-Xblock
go build -ldflags "-X main.version=$(git describe --abbrev=0 --tags) -X main.buildTime=$(date)"Encapsulate variables in different package than main #
If you want to import those variables to different package than main it's good practice to encapsulate it in different package.
Let's keep them in package build in separate directory.
Create directory build and file build/build.go
mkdir build
touch build/build.go
vim build/build.gopackage build
var (
// These variables are replaced by ldflags at build time
GitVersion = "v0.0.0-main"
GitCommit = ""
BuildTime = "1970-01-01T00:00:00Z" // build date in ISO8601 format
)And we can print in in main.go as an example
package main
import (
"fmt"
"github.com/me/my-app/build"
)
func main() {
fmt.Println("GitCommit:\t", build.GitCommit)
}This time you need to know your module name. It's in first line of go.mod file
$> head -1 go.mod
module github.com/me/my-appFinally we can compose command where github.com/me/my-app is our main module, github.com/me/my-app/build is full path to build package and GitCommit is variable dynamically linked on build time
go build -ldflags="-X 'github.com/me/my-app/build.GitCommit=$(shell git rev-parse --short=7 HEAD)'" -o=/tmp/bin/my-app .Conclusion #
Adding version to your app is useful for 'About' page, startup info or --version command line flag. It's like putting a sticker on a product after it's made. This info is essential for debugging app that is already on production. Now users always know which version they're using!
Published