在工作中,经常需要查看一些应用程序的版本,使用-v--vserion等参数查看一个应用的版本,比如:

# node -v
v16.13.1

# go version
go version
go version go1.12.9 linux/amd64

那通过go build构成后生成的可执行文件,如果获取它的版本呢? 你是否会想到,直接在代码中写死版本?当然可以,但是太麻烦了,发布版本前需要在代码中修改版本。

一般在发布应用程序时,都需要先go build,那么可以通过-ldflags参数来注入版本到应用程序中。

package main

import (
    "fmt"

    "github.com/spf13/pflag"
)

var (
    // version 定义版本变量
    version = "v0.0.0"
    // pVersion 接收命令行参数v
    pVersion = pflag.BoolP("version", "v", false, "show version info.")
)

func init() {
    pflag.Parse()
    if *pVersion {
        fmt.Println(version)
    }
}

func main() {}

使用go build编译时,加上-ldflags -X参数,将变量注入到main.verison变量中,-ldflags后面的-X就是指将后面的变量(key=version)注入到程序中,变量的key需要指定完整包名,main.version就是指main包下的version变量。

go build -ldflags="-X main.version=v1.0.0"

然后,使用./main -v就可以查看版本:

# ./main -v
v1.0.0

科学的使用-ldflags,可以在go build编译时,将有用的变量信息注入到应用程序中,可以设置版本、环境、各种标记等信息,而避免直接写死代码。