Pi*R^2

golang 二进制文件中添加编译信息

字数统计: 489阅读时长: 2 min
2019/06/20 Share

在编译二进制程序时,动态赋值程序的某些值,使程序包含了可靠的编译信息。

Go 二进制中包含编译信息

  • 如果服务上线后,不知道此二进制文件是哪个版本产出的二进制,那么本文可以帮助你实现相关的功能。
  • 在二进制代码发布时,传入必要的版本信息,以便日后可查看相关信息。
  • 可用于 git-runner 中,直接获取版本信息、分支信息等,填充相应参数。

效果展示

binary 是我们例子中的二进制文件

1
2
3
4
5
6
# ./main -v
Commit ID : 123
Build Name: version test
Build Time: 20190620
Build Vers: 1.1
Golang Vers: go version go1.10.3 linux/amd64

实现方法

  1. 在golang 解析参数部分添加如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import "github.com/lpflpf/version"
import "flag"

func main() {
var showVer bool
// 为了举例,所以仅使用了-v 选项
flag.BoolVar(&showVer, "v", false, "show build version")
flag.Parse()

if showVer {
version.Show()
}
}

version 包如下:

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

import (
"fmt"
"os"
)

// 连接过程中修改如下5个参数,可以自行添加使用
var (
BuildVersion string
BuildTime string
BuildName string
CommitID string
GoVersion string
)

func Show() {
fmt.Printf("Commit ID : %s\n", CommitID)
fmt.Printf("Build Name: %s\n", BuildName)
fmt.Printf("Build Time: %s\n", BuildTime)
fmt.Printf("Build Vers: %s\n", BuildVersion)
fmt.Printf("Golang Vers: %s\n", GoVersion)
os.Exit(0)
}
  1. 编译程序,编译脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
BUILD_TIME=`date +%Y%m%d`
BUILD_VERSION=1.1
COMMIT_ID=123
GO_VERSION=`go version`
BUILD_NAME="version test"
VERSION_PKG='github.com/lpflpf/version'
LD_FLAGS="-s -w -X '$VERSION_PKG.BuildTime=$BUILD_TIME' \
-X '$VERSION_PKG.BuildVersion=$BUILD_VERSION' \
-X '$VERSION_PKG.BuildName=$BUILD_NAME' \
-X '$VERSION_PKG.CommitID=$COMMIT_ID' \
-X '$VERSION_PKG.GoVersion=$GO_VERSION'"
go build -ldflags "$LD_FLAGS" main.go
  1. 执行脚本, 则看到本文开头说明的二进制版本信息

原理分析

在golang 进行连接包时,允许将字符串传入包的变量中。因此,在编译时,通过ld选项添加相应变量,实现了二进制中保存编译信息的功能。

参考文档

  1. golang 连接说明
  2. version 包
CATALOG
  1. 1. Go 二进制中包含编译信息
    1. 1.1. 效果展示
    2. 1.2. 实现方法
  2. 2. 原理分析
    1. 2.1. 参考文档