成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

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

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

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

簡介

如果你曾經運行過 docker version,

就會發(fā)現(xiàn)它提供了很多信息:

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

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

如何實現(xiàn)

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

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

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

這兩種都不太好, 比如編譯時間就不太好確定.
最好是能在 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.

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

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

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

總結

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

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

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

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

巨人網(wǎng)絡通訊聲明:本文標題《使用 Go 管理版本的方法示例》,本文關鍵詞  使用,管理,版本,的,方法,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用 Go 管理版本的方法示例》相關的同類信息!
  • 本頁收集關于使用 Go 管理版本的方法示例的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    无码国产色欲xxxx视频| 91小视频在线免费看| 国产综合久久久久久鬼色| 欧美乱妇一区二区三区不卡视频| 色噜噜狠狠一区二区三区果冻| 新片速递亚洲合集欧美合集| 91精品国产综合久久久蜜臀图片| 国产精品手机播放| 日本大香伊一区二区三区| 欧美国产激情视频| 亚洲精选视频在线| 精品电影一区二区三区| 久久不卡免费视频| 日本欧美中文字幕| 久久久久久久成人| 欧美激情综合色综合啪啪五月| 天天干天天舔天天操| 日韩精品视频无播放器在线看| 国产成+人+日韩+欧美+亚洲| 91麻豆国产福利在线观看| 欧美黑人性受xxxx喷水| 久草免费在线观看| 日韩在线激情| 色综合视频一区二区三区44| 亚洲第一福利社区| 亚洲欧美一区二区三区极速播放| 色丁香婷婷综合久久| 亚洲精品中文字幕99999| 日韩av观看网址| 国产专区一区二区三区| 欧美日韩免费看片| 欧美中文字幕不卡| 日韩激情一二三区| 一区二区三区免费观看视频| 午夜日韩在线| 亚州精品国产精品乱码不99按摩| 日本黄网站免费| 91精品国产免费久久久久久| 三级在线电影| 国产精品豆花视频| 国产精品亚洲二区| 日韩电影中文字幕av| 欧美xxx黑人xxx水蜜桃| 99热在线免费观看| 日本福利视频网站| 亚洲欧美激情插| 国产爆乳无码一区二区麻豆| 日本三级亚洲精品| 欧美 日韩 国产精品| 欧美资源在线观看| 亚洲图片小说区| 精品综合久久88少妇激情| 亚洲欧美成人网| 色版视频在线观看| 色多多国产成人永久免费网站| 青青草视频在线观看| 成人av蜜桃| 国产麻豆精品在线观看| 欧美日韩国产精选| 女人天堂av在线播放| 卡一卡2卡三精品| 成人中文字幕在线播放| 91综合免费在线| 国产三级在线免费| 午夜影院免费观看视频| 欧美高清videosex极品| 日韩在线中文字幕视频| 香蕉伊大人中文在线观看| 88xx成人永久免费观看| 狠狠综合久久av一区二区| 国产视频观看一区| 中文字幕永久有效| 精品久久久久av影院| 国产成人精品午夜| 中文字幕乱码视频| 一区二区免费在线观看| 一卡二卡三卡亚洲| 青青青青在线| 在线视频观看日韩| 国产精品a久久久久| 狂野欧美性猛交xxxxx视频| 国产日产欧美精品| 国产精品1区2区3区| 日本视频在线观看| 亚洲淫成人影院| 日本免费黄色小视频| 国产精品美女在线观看| 欧美日韩一区二区三区四区五区六区| av网站免费在线看| 老子影院午夜伦不卡大全| 色哟哟精品一区| xxxxxx在线观看| 国产免费成人av| 色噜噜夜夜夜综合网| www.91在线播放| 99精品视频在线播放免费| 少妇高潮爽到全身痉挛抽搐| 果冻天美麻豆一区二区国产| av在线天堂播放| 91亚洲精华国产精华精华液| 男人天堂新地址| 亚洲va综合va国产va中文| 欧美大陆国产| 电影网一区二区| 美女撒尿一区二区三区| 精品一区二区影视| 男人天堂中文字幕| 亚洲跨种族黑人xxx| 超碰在线97免费| 成年人在线观看视频免费| 国产精品伦一区二区| www.视频在线.com| 网站黄色在线观看| 99精品国产99久久久久久福利| 97免费高清电视剧观看| 香蕉久久精品日日躁夜夜躁| 狠狠色噜噜狠狠狠狠8888| 作爱视频免费观看视频在线播放激情网| 欧美日韩国产首页| 日本亚洲不卡| 激情欧美一区二区三区| 亚洲欧洲精品在线| 黄色网址中文字幕| 人人艹在线视频| 国产成人综合自拍| 在线免费观看中文字幕| 亚洲国产高清视频| 国产精品扒开腿做爽爽爽视频| 蜜桃av.网站在线观看| 亚洲欧美国产一区二区| 日韩高清在线观看一区二区| 欧美人动性xxxxz0oz| 色综合久久88色综合天天看泰| 久久国产福利| 国产97人人超碰caoprom| 五月天福利视频| 国产精品vip| 亚洲一卡二卡三卡四卡无卡网站在线看| 99自拍视频在线观看| 韩国三级av在线免费观看| 日产精品久久久久久久蜜臀| 久久色视频免费观看| 亚洲一区二区三区视频| 欧美三级电影网址| 成人av网址在线观看| 欧美成人亚洲成人| 精品成人乱色一区二区| 成人综合国产精品| 日本成年人网址| 91麻豆精东视频| 女同视频在线观看| 制服丝袜中文字幕在线观看| 国产制服丝袜在线| 亚洲欧美激情插| 韩日视频在线| 91在线国产福利| 亚洲人成77777男人| 91美女视频网站| 亚洲第一视频区| 精品中文字幕一区二区三区av| www.激情.com| 亚洲精品tv久久久久久久久久| 波多野结依一区| 国产精品久久久久久久久免费相片| 日韩免费观看一区二区| 色午夜这里只有精品| 日韩三级视频在线观看| 白白色 亚洲乱淫| 天堂视频免费看| 日韩一区二区在线观看视频播放| 午夜精品久久久久久久久久久久久蜜桃| 天天色影综合网| 国产精品免费一区二区三区观看| 久久99国产综合精品免费| 国产成人精品a视频| 色悠久久久久综合先锋影音下载| 亚洲国产激情av| 亚洲精品一二三**| 国产精品视频一区二区三区| 精品一区二区三区免费视频| 欧美最猛性xxxxxhd| 亚洲最大视频网| 欧美日韩免费区域视频在线观看| 国产午夜精品视频| 色综合99久久久无码国产精品| 99久久久久久久久久| 亚洲女同二女同志奶水| www精品久久| 亚洲电影在线播放| 国产又粗又大又爽的视频| 国产探花在线观看视频| 国产视频精品久久久| 欧美乱强性伦xxxxx| 亚洲依依成人| 欧美精品情趣视频| 国产视频第一区| 欧美日韩免费精品| 九九精品免费视频| 久久大大胆人体| 偷拍与自拍一区| 日韩亚洲在线视频| 亚洲视频高清| 男男电影完整版在线观看| 欧美国产激情二区三区| 波多野结衣啪啪| 亚洲成人在线视频网站| 亚洲欧洲一区二区在线播放| 国产1区2区视频| 97视频在线观看网站| 国产激情视频一区二区三区| 亚洲偷熟乱区亚洲香蕉av| 九色综合国产一区二区三区| 丝袜制服影音先锋| 成人午夜视频网站| 欧美另类极品| 亚洲91精品在线观看| 亚洲涩涩av| 国产综合动作在线观看| 欧美 激情 在线| 欧美日韩一区二区三区四区五区| 久久久久久久久久久视频| 亚洲欧美手机在线| 亚洲激情久久久| 日韩一区二区高清视频| 麻豆免费在线| 白嫩亚洲一区二区三区| 在线视频自拍| 日韩国产精品大片| 国产日产高清欧美一区二区三区| 91免费在线播放视频| 亚洲人成7777| 狠狠色噜噜狠狠狠888奇米| 中国黄色录像片| 骚虎黄色影院| 久久99精品久久久水蜜桃| 欧美变态视频| 比比资源先锋影音网| 国产精品变态另类虐交| 欧美日韩综合另类| 亚洲天堂男人的天堂| 国产午夜精品视频一区二区三区| 亚洲精彩视频| 伊人色综合久久| 日本蜜桃在线观看| 国产高清中文字幕| 成年女人午夜毛片免费看| 麻豆视频免费在线观看| 欧美精品三级在线观看| 亚洲午夜日本在线观看| 亚洲国产综合网| 亚洲综合免费观看高清完整版在线| 亚洲一区二区三区在线观看网站| 美女网站免费观看| 91色视频在线观看| 欧美大片大片在线播放| 2020久久国产精品| 欧美成人精品3d动漫h| 少妇特黄a一区二区三区| 欧美黑人粗大| 中文字幕日韩三级| 伊人久久高清| 91在线直播亚洲| 天天撸夜夜操| 国产视频一区二区不卡| 欧美精品久久久久久久久46p| 天堂av在线8| 啪啪免费视频一区| 亚洲视频高清| 日本不卡一区二区三区| 婷婷国产在线综合| 深夜福利视频在线免费观看| 18video性欧美19sex高清| 美丽的姑娘在线观看免费动漫| 精品精品国产国产自在线| 日韩精品一区二区三| 9自拍视频在线观看| 在线视频1卡二卡三卡| 欧美视频一区二区三区| 久久高清免费观看| 久久天天躁日日躁| wwwwww日本| 欧美精品一区二区三区在线看午夜| 亚洲自拍偷拍欧美| 欧美日韩高清一区二区| 91久久久精品| 精品1区2区在线观看| 国产精品午夜视频| 欧美一卡二卡在线观看| 国产日韩精品一区二区浪潮av| 青春草在线视频| 3751色影院一区二区三区| 亚洲精品视频网址| 日韩欧美成人精品| a级片免费观看| 亚洲精品久久久久avwww潮水| 国产xxxxx视频| 不卡av一区二区| 日韩激情在线| 国产婷婷在线视频| 大伊香蕉精品在线品播放| 色吊丝av中文字幕| 日韩欧美三级视频| 婷婷成人综合网| 国产精品日韩欧美大师| 色婷婷综合网站| 国产精品久久国产三级国电话系列| 精品三级久久久久久久电影聊斋| 日产精品久久久久| 亚洲视频一区二区三区| 国产91精品久久久久久| 亚洲午夜精品久久久久久浪潮| 欧美黑人一区| 欧美黑人性受xxxx喷水| 麻豆福利在线观看| 国产三级精品三级在线观看| 亚洲摸摸操操av| 9久久婷婷国产综合精品性色| 青青草97国产精品麻豆| 国产黄色在线播放| 精品国产免费久久久久久婷婷| 国产欧美日韩免费看aⅴ视频| 国产福利免费在线观看| 男人的天堂官网| 美女久久久久久久久久| 久久福利免费视频| 久久久久99精品一区| 欧美肉体xxxx裸体137大胆| 精品国产乱码久久久久久88av|