詳解如何在Go項目中輸出版本信息
我們經(jīng)常在使用CLI工具的時候,都會有這樣的參數(shù)輸出:
➜ ~ docker version Client: Docker Engine - Community Version: 18.09.2 API version: 1.39 Go version: go1.10.8 Git commit: 6247962 Built: Sun Feb 10 04:12:39 2019 OS/Arch: darwin/amd64 Experimental: false ➜ ~
可以打印出構(gòu)建時對應(yīng)的版本信息,比如 Version,Go Version,Git Commit等,這個是如何實現(xiàn)的呢?
實現(xiàn)
主要是通過ldflags參數(shù)來實現(xiàn)在構(gòu)建的時候?qū)ψ兞窟M行賦值。
比如下面一段代碼:
package main import ( "flag" "fmt" "os" ) //需要賦值的變量 var version = "" //通過flag包設(shè)置-version參數(shù) var printVersion bool func init() { flag.BoolVar(&printVersion, "version", false, "print program build version") flag.Parse() } func main() { if printVersion { println(version) os.Exit(0) } fmt.Printf("example for print version") }
構(gòu)建命令:
go build -ldflags "-X main.version=v0.1" -o example
程序輸出:
➜ ./example version=v0.1
參數(shù)說明
1、-ldflags build命令中用于調(diào)用接鏈接器的參數(shù)
-ldflags '[pattern=]arg list' arguments to pass on each go tool link invocation.
2、-X 鏈接器參數(shù),主要用于設(shè)置變量
-X importpath.name=value Set the value of the string variable in importpath named name to value. Note that before Go 1.5 this option took two separate arguments. Now it takes one argument split on the first = sign.
一個完整的例子
這里將version包單獨做了一個包存放,只需要引入即可:
package main import ( "flag" "github.com/go-demo/version" ) //通過flag包設(shè)置-version參數(shù) var printVersion bool func init() { flag.BoolVar(&printVersion, "version", false, "print program build version") flag.Parse() } func main() { if printVersion { version.PrintVersion() } }
構(gòu)建的shell如下(也可以放在Makefile中):
#!/bin/sh version="v0.1" path="github.com/go-demo/version" flags="-X $path.Version=$version -X '$path.GoVersion=$(go version)' -X '$path.BuildTime=`date +"%Y-%m-%d %H:%m:%S"`' -X $path.GitCommit=`git rev-parse HEAD`" go build -ldflags "$flags" -o example example-version.go
TIPS: 如果值內(nèi)容中含有空格,可以用單引號
最終版本輸出:
➜ sh build.sh ➜ ./example -version Version: v0.1 Go Version: go version go1.13.1 darwin/amd64 Git Commit: a775ecd27c5e78437b605c438905e9cc888fbc1c Build Time: 2020-01-09 19:01:51
完整代碼:https://github.com/go-demo/version
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Go map底層實現(xiàn)與擴容規(guī)則和特性分類詳細講解
這篇文章主要介紹了Go map底層實現(xiàn)與擴容規(guī)則和特性,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03Go語言讀取,設(shè)置Cookie及設(shè)置cookie過期方法詳解
這篇文章主要介紹了Go語言讀取,設(shè)置Cookie及設(shè)置cookie過期方法詳解,需要的朋友可以參考下2022-04-04