在 Ubuntu 下使用 Golang 打包(构建)时设置版本号,常见做法是通过 编译时注入 -ldflags 的 X 参数,把版本号写入变量中。这是 Go 官方推荐的方式。
下面按常见使用场景给你一个完整说明。
-ldflags -X 设置版本号一般放在 main.go 或 version.go 中:
package main
import "fmt"
var (
version = "unknown"
commit = "unknown"
date = "unknown"
)
func main() {
fmt.Printf("Version: %s\n", version)
fmt.Printf("Commit : %s\n", commit)
fmt.Printf("Date : %s\n", date)
}
在 Ubuntu 终端中执行:
go build -ldflags "\
-X main.version=1.2.3 \
-X main.commit=$(git rev-parse HEAD) \
-X main.date=$(date +%Y-%m-%dT%H:%M:%S)" \
-o myapp
运行:
./myapp
输出示例:
Version: 1.2.3
Commit : 3f4a9c2e...
Date : 2026-01-15T10:30:00
✅ 这是生产环境最推荐的方式
VERSION=$(git describe --tags --always)
COMMIT=$(git rev-parse HEAD)
DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ)
go build -ldflags "\
-X main.version=${VERSION} \
-X main.commit=${COMMIT} \
-X main.date=${DATE}" \
-o myapp
适合:
main 以外的 package如果你的版本变量不在 main 包,而是 cmd/app 或 internal/version:
package version
var Version = "unknown"
构建时:
go build -ldflags "-X github.com/yourname/yourrepo/internal/version.Version=1.2.3"
⚠️ 注意:
VERSION ?= $(shell git describe --tags --always)
COMMIT ?= $(shell git rev-parse HEAD)
DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
build:
go build -ldflags "\
-X main.version=$(VERSION) \
-X main.commit=$(COMMIT) \
-X main.date=$(DATE)" \
-o myapp
使用:
make build
-ldflags 的替代方案| 方式 | 适合场景 | 缺点 |
|---|---|---|
-ldflags -X |
生产、发布 | 最常见 ✅ |
读取 VERSION 文件 |
简单项目 | 依赖运行时 |
| 读取 Git 信息 | 简单 CLI | 运行时调用 git |
使用 goreleaser |
正式发布 | 需要学习成本 |
❌ 变量未导出(小写):
var version = "1.0" // 不行
✅ 正确:
var Version = "1.0"
❌ 包路径写错:
-X version.Version=1.0 # 错误
✅ 正确:
-X github.com/user/repo/version.Version=1.0
Ubuntu 下 Go 打包设置版本号,最标准方式是通过
go build -ldflags "-X 包路径.变量=值"注入版本信息。
如果你需要:
可以继续问我,我可以直接给你完整示例。