Go -v 顯示版本號和編譯時間示例
阿新 • • 發佈:2018-12-11
C語言想要 -v 顯示編譯時間,可以使用 _DATE_, _TIME_ 這兩個巨集,
而 Go 沒有類似的常量,當然可以使用 Go 呼叫 C 程式碼(這是另一種方法)
然而,更好的方法是使用 go build 的 -ldflags 引數
原理如下:
$ 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程式時,新增指定包的指定變數
----------------------------- 專案示例分割線 ----------------------------
完整專案見 github
version/version.go:
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:
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 等變數,
然後在 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 命令就可以使用了