Go

编译 Go 程序时加入 git commit 等额外信息

Posted by icebergu on 07-29,2020

在编译 Go 程序的时候如何加入一些额外的信息,比如 当前最新的 commit sha,编译的 go version 之类的

通过 go build -ldflags "-X importpath.name=value' " 赋值字符串value给指定包importpath中的变量name

-ldflags 会将后边的参数传递给 go tool link 链接器
go tool link 的 -X 会将字符串赋值给指定包中变量,格式是 importpath.name=value

// main.go
package main

import "fmt"

var (
    Author string
    GoVersion   string
)

func main() {
    fmt.Printf("Author: %s\n", Author)
    fmt.Printf("GoVersion: %s\n", Date)
}

可以赋值多个变量

$ go build -ldflags "-X 'main.Author=iceber' -X 'main.GoVersion=`go version`'" main.go
$ ./main
Author: iceber
GoVersion: go version go1.13.4 darwin/amd64

赋值其他包中的变量

$ go build -ldflags "-X 'github.com/Iceber/test/pkg/build.GitCommitSha=`git log --pretty=format:%h`'" .

分享一下获取 git commit sha 的方法

获取一行 commit sha + commit message

# 显示一行简洁的信息 sha 和 message
$ git log --pretty=oneline -1
1b956f133ba1de1d53f76461d6d1b625b303f29d fix

使用 abbrev-commit flag 可以获取前 7 位 commit sha

$ git log --pretty=oneline --abbrev-commit -1
1b956f13 fix

直接使用 oneline flag

$ git log --oneline -1
1b956f13 fix

如果只显示 sha 怎么办呢

$ git log --pretty=format:'%h' -1
1b956f13

需要使用 pretty format
%h 可以打印缩短的 sha
%H 打印完整 sha
%s 打印 commit message

详细可以参考 git log 输出格式