Golang 编译时设置变量

2,515 阅读1分钟

Golang 是编译成可执行文件运行的。有没有办法可以在编译时把一些信息比如打包时间,作者,git 信息打包到可执行文件里呢?

有,可以通过 -ldflags 参数设置。

package main

// 定义变量
var Version string

func main() {
    fmt.Println(Version)
}

编译设置变量

go build -o bin/ -ldflags "-X main.Version=0.1.0"

-X definition: 添加形式为 importpath.name=value 的字符串值定义,注意 value 字符串不能有空格(暂时没找到解决方案)

有了这个参数,就可以给编译增加一些版本信息注入了,这样有bug就好定位代码了。

改造项目,结构如下:

demo
 ├───build
 │    └─build.go
 ├───cmd
 │    └─main.go
 ├─go.mod
 ├─go.sum

main.go

package main

import (
	"demo/build"
	"flag"
	"fmt"
	"os"
)

var version = flag.Bool("v", false, "Version")

func main() {
	flag.Parse()

	if *version {
		fmt.Println(build.String())
		os.Exit(0)
		return
	}

	fmt.Println("Other...")
}

build.go

package build

import "fmt"

var (
	AppName string
	Branch  string
	Commit  string
	Author  string
	Date    string
	Version string
)

func String() string {
	return fmt.Sprintf("AppName: %s\nVersion: %s\nBranch: %s\nCommit: %s\nAuthor: %s\nDate: %s", AppName, Version, Branch, Commit, Author, Date)
}

build.sh

#!/usr/bin/env bash

BRANCH=$(git symbolic-ref --short -q HEAD)
COMMIT=$(git rev-parse --verify HEAD)
NOW=$(date '+%FT%T%z')
VERSION="0.1.0"
RUN_USER=$(whoami)

go build -o bin/ -ldflags "-X demo/build.AppName=Demo\
 -X demo/build.Branch=${BRANCH}\
 -X demo/build.Commit=${COMMIT}\
 -X demo/build.Author=${RUN_USER}\
 -X demo/build.Date=${NOW}\
 -X demo/build.Version=${VERSION}" cmd/main.go

打包,执行

$ ./build.sh
$ ./bin/main.exe -v                                   
AppName: Demo                                         
Version: 0.1.0                                        
Branch: master                                        
Commit: ea2ce0b45e2c2def3bbbd2dd3787e1d84272f6ea      
Author: lanyue                                        
Date: 2021-12-03T10:11:33+0800
$ ./bin/main.exe
Other...