婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 使用 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 管理版本的方法示例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品99久久久久久有的能看| 色综合天天综合色综合av| 亚洲日本一区二区三区| 亚洲欧美一区二区三区久本道91| 亚洲欧美日韩国产综合在线| 精品在线播放免费| 日韩欧美在线影院| 亚洲国产成人av网| 欧美午夜不卡在线观看免费| 欧美激情在线一区二区| 国产精品一区二区果冻传媒| 精品奇米国产一区二区三区| 三级精品在线观看| 日韩视频在线你懂得| 精品一区二区三区免费观看| 精品88久久久久88久久久| 精品一区二区三区免费视频| 欧美一区二区三区日韩| 国产中文一区二区三区| 国产精品免费视频观看| av一区二区三区四区| 国产精品毛片a∨一区二区三区| 婷婷国产v国产偷v亚洲高清| 日韩一区二区在线观看视频 | 国产亚洲欧美在线| 国产盗摄视频一区二区三区| 欧美高清在线一区| 99精品偷自拍| 国产美女娇喘av呻吟久久| 国产欧美一区二区三区在线老狼| www.性欧美| 久久疯狂做爰流白浆xx| 中文字幕日韩欧美一区二区三区| 在线视频亚洲一区| 精品一区免费av| 亚洲一级二级三级| 日本一区二区三区高清不卡| 欧美日韩一区二区电影| 粉嫩一区二区三区在线看| 热久久一区二区| 亚洲一区二区av在线| 国产精品久久久久一区二区三区 | 久久99精品久久久| 亚洲激情在线激情| 国产精品区一区二区三| 国产女人水真多18毛片18精品视频 | 国产综合久久久久久鬼色 | 久久精品国产第一区二区三区| 国产精品伦理在线| 国产欧美一区二区精品久导航| 在线观看精品一区| 99re热这里只有精品视频| 国产成人午夜精品影院观看视频| 日韩专区在线视频| 26uuu精品一区二区| 亚洲午夜私人影院| 日韩欧美一级二级三级| 日韩欧美亚洲国产精品字幕久久久| 色哟哟一区二区| 在线免费观看一区| 欧美日韩高清一区二区| 欧美精品一区二区在线观看| 中文子幕无线码一区tr| 亚洲国产一区视频| 国产精品影视网| 欧美性受xxxx黑人xyx性爽| 日韩精品一区二| 一区二区三区在线视频观看| 另类人妖一区二区av| 色综合久久99| 中文字幕一区在线观看视频| 视频一区二区中文字幕| 成人污视频在线观看| 欧美午夜电影网| 亚洲欧美另类在线| 成人国产精品免费观看| 欧美精品vⅰdeose4hd| 久久综合色鬼综合色| 亚洲丰满少妇videoshd| 国产成人aaaa| 国产精品乱人伦| 粉嫩嫩av羞羞动漫久久久| 日韩美一区二区三区| 亚洲123区在线观看| 色一情一伦一子一伦一区| 国产精品人成在线观看免费| 国产乱码精品1区2区3区| 国产亚洲一二三区| 国产mv日韩mv欧美| 国产精品视频线看| 国产精品中文欧美| 欧美激情中文字幕一区二区| www.欧美日韩| 首页亚洲欧美制服丝腿| 日韩欧美黄色影院| 成人夜色视频网站在线观看| 国产精品国产馆在线真实露脸 | 亚洲国产一区二区三区| 欧美性猛交一区二区三区精品| 亚洲国产精品人人做人人爽| 69堂精品视频| 99精品视频在线播放观看| 天天色图综合网| 亚洲欧美一区二区三区久本道91 | 久久综合资源网| 色噜噜偷拍精品综合在线| 一区二区三区美女| 亚洲国产精品传媒在线观看| 欧美专区日韩专区| 国产一区二区三区av电影| 国产精品欧美一级免费| 制服丝袜激情欧洲亚洲| 欧美艳星brazzers| 成人一区在线观看| 国产麻豆一精品一av一免费| 亚洲人xxxx| 亚洲一二三区不卡| 亚洲免费观看高清在线观看| 国产色爱av资源综合区| 精品国产不卡一区二区三区| 日韩视频永久免费| 日韩午夜三级在线| 精品少妇一区二区三区在线视频| 综合在线观看色| 性欧美疯狂xxxxbbbb| 亚洲欧美福利一区二区| 中文字幕在线观看不卡| 亚洲欧美一区二区久久 | 色综合天天性综合| 99视频超级精品| 日本精品一级二级| 欧美日韩视频第一区| 日韩午夜激情av| 国产午夜久久久久| 一区二区三区小说| 久久99国产精品久久99| 不卡av在线网| 日韩欧美亚洲一区二区| 国产精品无码永久免费888| 亚洲www啪成人一区二区麻豆| 麻豆一区二区在线| 91丨九色porny丨蝌蚪| 精品日韩在线一区| 一区二区日韩av| 成人在线视频一区| 3d动漫精品啪啪1区2区免费| 欧美电影在线免费观看| 一区二区三区波多野结衣在线观看 | 日韩黄色片在线观看| 国产不卡视频在线播放| 欧美日韩国产欧美日美国产精品| 国产亚洲欧美日韩日本| 久久99日本精品| 欧美妇女性影城| 中文字幕欧美一| 国产福利电影一区二区三区| 欧美日韩美女一区二区| 一区二区三区久久| 欧美伊人久久久久久久久影院| 亚洲欧洲无码一区二区三区| 国产精品资源网站| 久久精品夜夜夜夜久久| 国产在线观看一区二区| 欧美一区二区大片| 国产精品一区二区男女羞羞无遮挡 | 99在线精品免费| 欧美电影免费提供在线观看| 麻豆精品在线看| 2024国产精品| 91成人看片片| 国产乱人伦精品一区二区在线观看| 国产精品女主播在线观看| 在线观看国产精品网站| 日本aⅴ亚洲精品中文乱码| 亚洲精品一区二区三区福利| 成人99免费视频| 狠狠色丁香九九婷婷综合五月| 久久综合国产精品| 日本精品免费观看高清观看| 狠狠色狠狠色综合| 亚洲.国产.中文慕字在线| 国产日韩欧美高清| 欧美一区二区视频在线观看 | 国产成人a级片| 午夜精品福利一区二区三区蜜桃| 国产亚洲一区二区三区在线观看| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 日本一区二区三区国色天香| 正在播放一区二区| 欧美吻胸吃奶大尺度电影| 不卡电影一区二区三区| 国产不卡高清在线观看视频| 久久精品国产精品青草| 老鸭窝一区二区久久精品| 日韩黄色免费电影| 天天射综合影视| 蜜桃视频一区二区三区在线观看 | 中文字幕免费不卡在线| 亚洲一区二区三区四区五区中文| 欧美一区二区三区视频免费|