Go -v 顯示版本號和編譯時間示例

C語言想要 -v 顯示編譯時間,能夠使用 _DATE_, _TIME_ 這兩個宏,mysql

而 Go 沒有相似的常量,固然能夠使用 Go 調用 C 代碼(這是另外一種方法)git

然而,更好的方法是使用 go build 的 -ldflags 參數github

原理以下:sql

$ go build --help
	-ldflags 'flag list'
		arguments to pass on each go tool link invocation.

$ go tool link --help
	-X definition
		add string value definition of the form importpath.name=value

也就是能夠在編譯Go程序時,添加指定包的指定變量shell

----------------------------- 項目示例分割線 ----------------------------函數

完整項目見 githubui

version/version.go:code

package version

import (
	"fmt"
	"os"
)

var (
	BuildVersion string
	BuildTime    string
	BuildName    string
)

func init() {
	args := os.Args
	if nil == args || len(args) < 2 {
		return
	}
	if "-v" == args[1] {
		fmt.Printf("%s: v%s (%s)\n", BuildName, BuildVersion, BuildTime)
	} else if "-h" == args[1] {
		fmt.Println("Usage:")
		fmt.Printf("./%s\n", BuildName)
		fmt.Printf("./%s -v\n", BuildName)
		fmt.Printf("./%s -h\n", BuildName)
	}
	os.Exit(0)
}

makefile:orm

BUILD_VERSION	:= 1.0.0
BUILD_TIME		:= $(shell date "+%F %T")
BUILD_NAME		:= go-version-sample
SOURCE			:= ./*.go
TARGET_DIR		:= /path-you-want/${BUILD_NAME}

all:
	go build -ldflags \
	"-X ${BUILD_NAME}/version.BuildVersion=${BUILD_VERSION} \
	-X '${BUILD_NAME}/version.BuildTime=${BUILD_TIME}' \
	-X ${BUILD_NAME}/version.BuildName=${BUILD_NAME}" \
	-o ${BUILD_NAME} ${SOURCE}

clean:
	rm ${BUILD_NAME} -f

install:
	# mkdir -p ${TARGET_DIR}
	# cp ${BUILD_NAME} ${TARGET_DIR} -f

.PHONY : all clean install ${BUILD_NAME}

makefile 文件中定義了 version 包中的 BuildTime 等變量,get

而後在 version 包的 init() 函數中使用

(還能夠添加 COMMIT_SHA1=`git rev-parse HEAD` 相似的變量)

main.go:

package main

import _ "go-version-sample/version"

import (
	"fmt"
)

func main() {
	fmt.Println("From main(): hello")
}

這裏把 version 包的引用放在最前面,好處是程序第一時間檢查參數,-v 顯示版本號後直接退出程序(包的初始化是按照聲明順序)。

不然程序會執行其餘包沒必要要的初始化(好比mysql鏈接)

(不把變量放到main包也是一樣的道理,由於main總會包含其餘包)

最後,使用 make, make clean, make install 命令就能夠使用了

相關文章
相關標籤/搜索