Go 编译时加入版本信息

-ldflags 参数

Go 编译时可通过 ldflags 动态的为程序里某个变量赋值,我们可以利用这个特性来达到将Go的信息和git 的commit 信息编译到我们的二进制文件中。

package main

import (
    "fmt"
    "os"
)
var (
    gitHash   string
    buildTime string
    goVersion string
)
func main() {
    args := os.Args
    if len(args) == 2 && (args[1] == "--version" || args[1] == "-v") {
        fmt.Printf("Git Commit Hash: %s \n", gitHash)
        fmt.Printf("Build TimeStamp: %s \n", buildTime)
        fmt.Printf("GoLang Version: %s \n", goVersion)
        return
    }
}

这里我们定义了三个变量gitHash buildTime goVersion,我们可以通过下面这个编译命令将三个变量给赋值进去

go build -ldflags "-X 'main.goVersion=$(go version)' -X 'main.gitHash=$(git show -s --format=%H)' -X 'main.buildTime=$(git show -s --format=%cd)'" -o main.exe version.go

查看效果

Go其他参数

-o 输出的二进制文件名
-v 编译时显示包名
-p n 开启并发编译,默认情况下该值为 CPU 逻辑核数
-a 强制重新构建
-n 打印编译时会用到的所有命令,但不真正执行
-x 打印编译时会用到的所有命令
-race 开启竞态检测

git commit格式化

查看git commit 的其他格式化参数 https://git-scm.com/docs/pretty-formats

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2
flags=-X main.buildDate=`date -u '+%Y-%m-%d'` -X main.gitHash=`git rev-parse --short HEAD`

build:
    go build -ldflags "$(flags)" -o file file.go

居家必备之makefile :yum:

4年前 评论

@shooter 确实,用makefile很方便,可惜我是Windows :new_moon_with_face:

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!