> 在编译 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`
```go
// 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)
}
```
可以赋值多个变量
```sh
$ 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**
```sh
# 显示一行简洁的信息 sha 和 message
$ git log --pretty=oneline -1
1b956f133ba1de1d53f76461d6d1b625b303f29d fix
```
**使用 `abbrev-commit` flag 可以获取前 7 位 commit sha**
```sh
$ git log --pretty=oneline --abbrev-commit -1
1b956f13 fix
```
**直接使用 `oneline` flag**
```sh
$ git log --oneline -1
1b956f13 fix
```
**如果只显示 sha 怎么办呢**
```sh
$ git log --pretty=format:'%h' -1
1b956f13
```
需要使用 `pretty format`
`%h` 可以打印缩短的 sha
`%H` 打印完整 sha
`%s` 打印 commit message
详细可以参考 [git log 输出格式](https://ruby-china.org/topics/939)
编译 Go 程序时加入 git commit 等额外信息