--- slug: setting-version-in-go title: "在 Go 程序中设置版本号并注入打包" authors: lxy tags: [ Golang, Build, Version, CI/CD ] --- ### 场景 在 Go 程序中设置并注入版本号是一种常见的做法,借助 -ldflags 参数,可以在编译时动态传递版本信息,使得生成的可执行文件包含明确的版本标识。这种方法可以帮助开发者轻松管理版本发布,并确保每个构建都带有唯一的版本号,方便后续调试、部署及追踪问题。 --- ### 1. 在 `main` 包中设置版本号 #### 示例代码 ```go package main import ( "flag" "fmt" "os" ) var version string // 定义版本变量 func main() { // 定义命令行参数 versionFlag := flag.Bool("version", false, "显示版本号") vFlag := flag.Bool("v", false, "显示版本号") // 解析命令行参数 flag.Parse() // 检查版本参数并输出 if *versionFlag || *vFlag { fmt.Printf("版本号: %s\n", version) os.Exit(0) // 输出后退出 } // 主程序逻辑 fmt.Println("运行主程序...") } ``` #### 打包命令 在打包时使用以下命令注入版本号: ```bash go build -ldflags "-X 'main.version=$(date +%Y.%m.%d-%H.%M.%S)'" -o your_program_name.exe ``` #### 查看版本号 ```bash your_program_name.exe -version // 显示版本号 ``` --- ### 2. 在模块中设置版本号 #### `monitor` 包 ```go package monitor var Version string // 定义版本变量 ``` #### 修改 `main.go` ```go package main import ( "flag" "fmt" "os" "your_project/monitor" // 修改为实际路径 ) func main() { // 定义命令行参数 versionFlag := flag.Bool("version", false, "显示版本号") vFlag := flag.Bool("v", false, "显示版本号") // 解析命令行参数 flag.Parse() // 检查版本参数并输出 if *versionFlag || *vFlag { fmt.Printf("监控版本: %s\n", monitor.Version) os.Exit(0) // 输出后退出 } // 主程序逻辑 fmt.Println("运行主程序...") } ``` #### 打包命令 在打包时使用以下命令注入版本号: ```bash go build -ldflags "-X 'your_project/monitor.Version=$(date +%Y.%m.%d-%H.%M.%S)'" -o your_program_name.exe ``` --- ### 总结 以上示例展示了如何在 `main` 包和模块中设置并注入版本号,以便在打包时动态注入版本号; 同样的也可以按照上面方法注入其他需要在打包时动态注入的其他变量。