在编译golang源代码的时候,我们有时候希望把版本、编译时间等等的信息添加到目标文件中,这些信息不应该在源代码中写死,而是应该在编译时再写入。golang中我们在编译时可以使用-ldflags编译选项来添加一些信息,这些信息会被写入到目标文件中。

我们先实现如下的一个golang源程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"os"
)

var (
buildStamp = ""
version = ""
goVersion = ""
)

func main() {
args := os.Args
if len(args) == 2 && (args[1] == "--version" || args[1] == "-v") {
fmt.Printf("Build TimeStamp : %s\n", buildStamp)
fmt.Printf("Version : %s\n", version)
fmt.Printf("Go Version : %s\n", goVersion)
}
}

在上面的源代码中我们定义了三个变量

  • buildStamp
  • version
  • goVersion

我们使用 --version 或者 -v 选项时可以打印出这三个变量,如果我们直接使用 go build main.go 编译源代码,则执行程序打印结果都是空值。

我们可以使用如下脚本来编译此程序,脚本中我们通过 -ldflags 选项修改变量的值

1
2
3
4
5
6
#!/usr/bin/env bash

flags="-X 'main.buildStamp=$(date '+%Y-%m-%d %H:%M:%S')' -X main.version=v1.0.0 -X 'main.goVersion=$(go version)'"
echo "Build flags: ${flags}"

go build -ldflags "$flags" -o main main.go

编译完之后我们执行 ./main -v 可以得到如下结果

Build TimeStamp : 2019-05-28 16:54:02
Version         : v1.0.0
Go Version      : go version go1.11.5 darwin/amd64

我们这样就可以把编译时的信息写入到目标程序中去了。

参考:https://ms2008.github.io/2018/10/08/golang-build-version/