前言

若想在编译时,为二进制文件添加编译信息,可以用连接器参数 ldflags-X 参数。关于更多 Go 连接器的信息可见:link command – cmd/link – Go Packages。这里贴出 -X 相关的内容:

-X importpath.name=value
Set the value of the string variable in importpath named name to value.
Note that before Go 1.5 this option took two separate arguments.
Now it takes one argument split on the first = sign.

Linux

编译时间

可以用 Linux 指令 date 来输出当前系统时间。

$ date "+%F %T"
2023-11-26 23:29:38

编译器版本

go version 输出编译器版本。

$ go version
go version go1.20.2 linux/amd64

添加全局变量

我这里将这两个全局变量设置在 main 包中:

package main

var (
    BuildTime string
    GoVersion string
)

编译指令

 go build -ldflags "-X 'main.GoVersion=$(go version)' -X 'main.BuildTime=$(date "+%F %T")'" .

Docker

在 Docker 中处理的方法也相同,但我的编译环境(wsl2+Docker)在直接执行这段编译指令时,编译时间会和实际时间相差 8 小时(毕竟是东 8 区)。

简单设置 TZ 环境变量也无法解决,最终的解决方案如下:

# 使用 golang alpine 作为编译环境
FROM golang:1.21.0-alpine as builder

# 从清华源安装 tzdata 包
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
    &&  apk add --no-cache tzdata && rm -rf /var/cache/apk/*

# 设置本地时区
ENV TZ=Asia/Shanghai

# 链接时间信息
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 复制代码
COPY . .

# 编译
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
    go build -ldflags "-s -w -X 'main.GoVersion=$(go version)' -X 'main.BuildTime=$(date "+%F %T")'" .

这段代码并不完整,其余部分请参考我的其它文章或 bellis/Dockerfile at 2075dcbdf681df3a0cd563ace7eb172dc50f0008 · bellis-daemon/bellis

结果

写了一段程序,在启动时输出这两个变量:

2023-11-26 23:36:46|           main.go:19 | [INFO]:    BuildTime: 2023-11-26 23:36:02, GoVersion: go version go1.21.0 linux/amd64

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注