校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 使用 Go 管理版本的方法示例

使用 Go 管理版本的方法示例

熱門標簽:福州鐵通自動外呼系統 廣東語音外呼系統供應商 濮陽自動外呼系統代理 地圖標注測試 長沙ai機器人電銷 烏魯木齊人工電銷機器人系統 智能電銷機器人營銷 賺地圖標注的錢犯法嗎 澳門防封電銷卡

簡介

如果你曾經運行過 docker version,

就會發現它提供了很多信息:

PS C:\Users\tzh> docker version
Client: Docker Engine - Community
 Version:      19.03.4
 API version:    1.40
 Go version:    go1.12.10
 Git commit:    9013bf5
 Built:       Thu Oct 17 23:44:48 2019
 OS/Arch:      windows/amd64
 Experimental:   false

Server: Docker Engine - Community
 Engine:
 Version:     19.03.4
 API version:   1.40 (minimum version 1.12)
 Go version:    go1.12.10
 Git commit:    9013bf5
 Built:      Thu Oct 17 23:50:38 2019
 OS/Arch:     linux/amd64
 Experimental:   false
 containerd:
 Version:     v1.2.10
 GitCommit:    b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
 Version:     1.0.0-rc8+dev
 GitCommit:    3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
 Version:     0.18.0
 GitCommit:    fec3683

對于編譯好的二進制文件而言, 獲取版本信息是非常重要的.
盡可能地提供詳細信息, 有利于后期的維護和排錯.

如何實現

對于版本信息等, 有兩種方式,

一種從外部獲取, 比如配置文件等,

另一種從源代碼中獲取, 將配置信息寫死在源代碼中.

這兩種都不太好, 比如編譯時間就不太好確定.
最好是能在 go build 時確定這些信息.

幸好, go build 提供了一個選項叫做 -ldflags '[pattern=]arg list'.

-X importpath.name=value
  Set the value of the string variable in importpath named name to value.
  This is only effective if the variable is declared in the source code either uninitialized
  or initialized to a constant string expression. -X will not work if the initializer makes
  a function call or refers to other variables.
  Note that before Go 1.5 this option took two separate arguments.

這使得我們可以在編譯生成二進制文件時, 指定某些變量的值.

比如我們有個文件是 company/buildinfo 包的一部分.

package buildinfo

var BuildTime string

運行 go build -ldflags="-X 'company/buildinfo.BuildTime=$(date)'" 會記錄編譯時間,

將 BuildTime 的值設置為編譯時的時間, 即從 $(date) 中獲取的時間.

參考:

Compile packages and dependencies
Command link
Including build information in the executable

實踐

新增 pkg/version 包, 用于獲取版本信息.

package version

// 這些值應該是從外部傳入的
var (
  gitTag    string = ""
  gitCommit  string = "$Format:%H$"     // sha1 from git, output of $(git rev-parse HEAD)
  gitTreeState string = "not a git tree"    // state of git tree, either "clean" or "dirty"
  buildDate  string = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')
)

package version

import (
  "fmt"
  "runtime"
)

// 構建時的版本信息
type VersionInfo struct {
  GitTag    string `json:"git_tag"`
  GitCommit  string `json:"git_commit"`
  GitTreeState string `json:"git_tree_state"`
  BuildDate  string `json:"build_date"`
  GoVersion  string `json:"go_version"`
  Compiler   string `json:"compiler"`
  Platform   string `json:"platform"`
}

func (info VersionInfo) String() string {
  return info.GitTag
}

func Get() VersionInfo {
  return VersionInfo{
    GitTag:    gitTag,
    GitCommit:  gitCommit,
    GitTreeState: gitTreeState,
    BuildDate:  buildDate,
    GoVersion:  runtime.Version(),
    Compiler:   runtime.Compiler,
    Platform:   fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),
  }
}

主要定義了一個結構體, 保持版本信息.

有些信息可以通過 runtime 獲取, 有些是編譯時傳進來的.

這里沒有明確的版本號, 而是使用 git tag 作為版本標簽.

最后, 定義一個命令 version.

package cmd

import (
  "encoding/json"
  "fmt"

  "github.com/spf13/cobra"
  "tzh.com/web/pkg/version"
)

var versionCmd = cobra.Command{
  Use:  "version",
  Short: "Print the version info of server",
  Long: "Print the version info of server",
  Run: func(cmd *cobra.Command, args []string) {
    printVersion()
  },
}

func printVersion() {
  info := version.Get()
  infoj, err := json.MarshalIndent(info, "", " ") // 加一點縮進
  if err != nil {
    fmt.Printf("遇到了錯誤: %v\n", err)
  }
  fmt.Println(string(infoj))
}

別忘了使用 AddCommand 添加子命令.

// 初始化, 設置 flag 等
func init() {
  cobra.OnInitialize(initConfig)
  rootCmd.PersistentFlags().StringVarP(cfgFile, "config", "c", "./conf/config.yaml", "config file (default: ./conf/config.yaml)")
  rootCmd.AddCommand(versionCmd)
}

由此, 代碼基本已經改完了, 還剩下最后一點, 修改 Makefile 文件,

以便簡化操作過程.

修改 Makefile

SHELL := /bin/bash
BASEDIR = $(shell pwd)

# build with version infos
versionDir = "tzh.com/web/pkg/version"
gitTag = $(shell if [ "`git describe --tags --abbrev=0 2>/dev/null`" != "" ];then git describe --tags --abbrev=0; else git log --pretty=format:'%h' -n 1; fi)
buildDate = $(shell TZ=UTC date +%FT%T%z)
gitCommit = $(shell git log --pretty=format:'%H' -n 1)
gitTreeState = $(shell if git status|grep -q 'clean';then echo clean; else echo dirty; fi)

ldflags="-w -X ${versionDir}.gitTag=${gitTag} -X ${versionDir}.buildDate=${buildDate} -X ${versionDir}.gitCommit=${gitCommit} -X ${versionDir}.gitTreeState=${gitTreeState}"

all: gotool build
build:
  go build -ldflags ${ldflags} ./
run:
  go run -ldflags ${ldflags} ./
docker:
  go run -ldflags ${ldflags} ./ -c ./conf/config_docker.yaml

首行定義了運行的 shell, 默認是 /bin/sh, 這里改成了更常用的 /bin/bash.

然后, 就是定義了一大堆需要的參數.
在運行 go build 的時候添加了參數 -ldflags ${ldflags}.

如此, 以后只要使用 make build 就能生成具有版本信息的二進制文件了.

編譯好之后, 可以運行 ./web version 查看具體的版本信息.

總結

通過為編譯時添加額外信息, 可以生成更具交互性的二進制文件.
同時, 也能體會到 Makefile 帶來的便捷.

當前部分的代碼
作為版本 v0.12.0

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

標簽:阿克蘇 太原 慶陽 廣西 調研邀請 貴陽 西雙版納 德州

巨人網絡通訊聲明:本文標題《使用 Go 管理版本的方法示例》,本文關鍵詞  使用,管理,版本,的,方法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用 Go 管理版本的方法示例》相關的同類信息!
  • 本頁收集關于使用 Go 管理版本的方法示例的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    亚洲国产日日夜夜| 欧美大白屁股肥臀xxxxxx| 韩日欧美一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 国产精品久久久久精k8| 国产精品成人免费| 中文字幕日韩一区二区| 亚洲欧美偷拍三级| 亚洲人成影院在线观看| 亚洲综合在线观看视频| 亚洲国产中文字幕在线视频综合| 亚洲免费视频中文字幕| 亚洲一区二区欧美| 日韩成人精品在线观看| 麻豆91小视频| 成人免费看视频| 色综合久久久久| 欧美丰满嫩嫩电影| 欧美大片在线观看| 中文字幕中文在线不卡住| 一区二区三区蜜桃网| 日本va欧美va精品| 国产成人免费在线视频| 91香蕉视频在线| 欧美日韩一区二区欧美激情| 日韩欧美在线一区二区三区| 精品国产伦一区二区三区观看方式 | 国产婷婷色一区二区三区四区 | 亚洲欧美国产毛片在线| 亚洲亚洲精品在线观看| 精品在线视频一区| 91网址在线看| 欧美一区二区播放| 国产欧美一区二区精品秋霞影院 | 精品国产麻豆免费人成网站| 亚洲三级小视频| 日韩精品乱码av一区二区| 国产精品一二三在| 欧美三区在线观看| 欧美国产在线观看| 视频一区免费在线观看| 国产成a人亚洲| 91麻豆精品国产91| 亚洲人妖av一区二区| 蓝色福利精品导航| 在线一区二区三区| 国产欧美日韩亚州综合| 性感美女久久精品| 色综合久久久久久久久久久| 久久夜色精品国产噜噜av| 亚洲成人综合在线| 97精品久久久久中文字幕| 日韩女同互慰一区二区| 亚洲一卡二卡三卡四卡| www.一区二区| 久久精品在这里| 精品系列免费在线观看| 欧美日韩一区二区三区在线看 | 午夜精品久久久久久久蜜桃app| 狠狠色丁香久久婷婷综合丁香| 91香蕉视频污| 国产精品对白交换视频| 国产乱国产乱300精品| 日韩一级免费一区| 舔着乳尖日韩一区| 欧美日韩电影在线播放| 亚洲主播在线播放| 91蜜桃传媒精品久久久一区二区| 久久影院午夜片一区| 男女视频一区二区| 欧美一级黄色片| 免费看精品久久片| 欧美大片日本大片免费观看| 免费日韩伦理电影| 欧美一区二区不卡视频| 日本伊人色综合网| 91麻豆精品91久久久久同性| 亚洲电影在线播放| 欧美另类高清zo欧美| 午夜欧美在线一二页| 欧美日韩一区二区三区免费看| 一二三区精品视频| 欧美日韩高清一区二区三区| 亚洲国产日韩av| 91精品国产91热久久久做人人 | 久久嫩草精品久久久久| 国产aⅴ综合色| 国产精品电影一区二区三区| 91网上在线视频| 亚洲成人在线网站| 欧美一区二区三区不卡| 久久国产乱子精品免费女| 久久综合丝袜日本网| 波多野结衣亚洲| 亚洲亚洲人成综合网络| 欧美大片在线观看一区二区| 成人精品在线视频观看| 一个色综合av| 久久亚洲二区三区| 91免费在线播放| 午夜精品福利一区二区蜜股av| 日韩一区二区三区视频| 成人在线视频一区二区| 亚洲一区二区视频在线| 欧美电影免费观看高清完整版| av电影在线观看一区| 天天色 色综合| 国产精品国产三级国产aⅴ中文 | 欧美性视频一区二区三区| 一区二区三区在线不卡| 91精品国产91久久久久久一区二区 | 欧美亚洲高清一区| 美女www一区二区| 欧美经典三级视频一区二区三区| 国产suv一区二区三区88区| 亚洲精品久久7777| 欧美一区二区国产| 亚洲成人av福利| 国产精品电影一区二区| 欧美日韩性生活| 国产精品自拍三区| 亚洲综合在线五月| 2023国产精品自拍| 91在线精品一区二区三区| 婷婷综合五月天| 337p日本欧洲亚洲大胆色噜噜| 成人黄色777网| 天天综合网天天综合色| 国产精品久线在线观看| 26uuu色噜噜精品一区| 色悠悠亚洲一区二区| 精品亚洲国内自在自线福利| 亚洲欧美另类小说| 欧美成人猛片aaaaaaa| 91免费在线视频观看| 激情图片小说一区| 五月综合激情日本mⅴ| 中文字幕一区二区三区色视频| 91精品久久久久久久久99蜜臂| 激情综合网av| 精品无码三级在线观看视频| 一区二区三区高清| 国产精品视频线看| 欧美大片在线观看一区二区| 不卡的av在线| 99国产精品一区| 国产成人av影院| 久久福利资源站| 天天色图综合网| 国产女同互慰高潮91漫画| 亚洲精品在线免费观看视频| 欧美在线看片a免费观看| 99热国产精品| 国产河南妇女毛片精品久久久| 亚洲美女在线一区| 亚洲精品国产a| 亚洲欧美日韩电影| 国产精品丝袜一区| 日韩视频免费观看高清完整版| 欧美日韩午夜在线| 欧美美女一区二区三区| 欧美乱妇23p| 欧美久久久久久久久久| 欧美日韩第一区日日骚| 欧美日韩一区二区三区四区五区| 暴力调教一区二区三区| 91免费视频观看| 色综合久久88色综合天天免费| av电影天堂一区二区在线观看| 国产黑丝在线一区二区三区| 东方aⅴ免费观看久久av| 国产91精品在线观看| 风间由美一区二区av101 | 日韩久久免费av| 久久久亚洲精品石原莉奈| 国产亚洲欧美在线| 国产精品乱码妇女bbbb| 亚洲欧洲制服丝袜| 亚洲视频 欧洲视频| 一区二区成人在线| 亚洲不卡av一区二区三区| 香蕉久久一区二区不卡无毒影院| 亚洲精品成人悠悠色影视| 日韩不卡一区二区| 国产在线精品视频| aaa国产一区| 欧美久久久久久蜜桃| 国产欧美日韩久久| 亚洲精品你懂的| 日日夜夜精品免费视频| 国产一区二区三区在线观看免费 | 国产婷婷一区二区| 亚洲国产精品二十页| 国产欧美一区二区在线观看| 亚洲欧美日韩综合aⅴ视频| 婷婷中文字幕一区三区| 国产精品996| 欧美日韩美少妇| 久久青草国产手机看片福利盒子| 成人欧美一区二区三区小说|