1. 程式人生 > 程式設計 >詳解如何在Go專案中輸出版本資訊

詳解如何在Go專案中輸出版本資訊

我們經常在使用CLI工具的時候,都會有這樣的引數輸出:

➜ ~ 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
➜ ~

可以打印出構建時對應的版本資訊,比如 Version,Go Version,Git Commit等,這個是如何實現的呢?

實現

主要是通過ldflags引數來實現在構建的時候對變數進行賦值。

比如下面一段程式碼:

package main

import (
 "flag"
 "fmt"
 "os"
)

//需要賦值的變數
var version = ""

//通過flag包設定-version引數
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")
}

構建命令:

go build -ldflags "-X main.version=v0.1" -o example

程式輸出:

➜ ./example
version=v0.1

引數說明

1、-ldflags build命令中用於呼叫接連結器的引數

-ldflags '[pattern=]arg list'
 arguments to pass on each go tool link invocation.

2、-X 連結器引數,主要用於設定變數

-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包設定-version引數
var printVersion bool

func init() {
  flag.BoolVar(&printVersion,"print program build version")
  flag.Parse()
}

func main() {
  if printVersion {
    version.PrintVersion()
  }
}

構建的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: 如果值內容中含有空格,可以用單引號

最終版本輸出:

➜ 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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。