最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Golang如何在編譯時(shí)注入版本信息

 更新時(shí)間:2023年06月18日 08:58:07   作者:Shawn27  
這篇文章主要為大家詳細(xì)介紹了Golang如何在編譯時(shí)實(shí)現(xiàn)注入版本信息,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下

問題

一般而言,稍微做得好一點(diǎn)的開源軟件,其二進(jìn)制文件都會(huì)帶上版本信息,比如Docker,你可以通過以下命令來查看:

$ docker --version
Docker version 20.10.17, build 100c701
$ docker version
...
//輸出太長(zhǎng),這里就不展示了

有些Web應(yīng)用還提供了/version接口,你可以通過接口來獲取:

$ curl http://127.0.0.1:8080/version | jq
{
  "Build Time": "Fri, 16 Jun 2023 16:19:23 +0800",
  "Git Commit": "b554659",
  "Go Version": "go1.19",
  "OS/Arch": "darwin/amd64",
  "version": "0.9.2"
}

然而很多公司并沒有這方面的強(qiáng)制性規(guī)范,多數(shù)開發(fā)人員也沒有這樣的意識(shí)或習(xí)慣,所以大部分項(xiàng)目并沒有實(shí)現(xiàn)這個(gè)功能。如果二進(jìn)制文件不帶上版本信息,你可能要借助其它系統(tǒng)來查詢或追溯,這無疑是一件難受的事,對(duì)于代碼調(diào)試和問題定位很不友好。

那么在Golang中,如何實(shí)現(xiàn)這個(gè)功能呢?

思路

版本信息有很多,比如代碼版本號(hào)、Git提交號(hào)、編譯時(shí)間、Go版本號(hào)等,如何讓二進(jìn)制文件帶上這些信息呢?

硬編碼在代碼里肯定不行。因?yàn)镚it提交號(hào)是將代碼提交到代碼倉(cāng)庫(kù)時(shí)才產(chǎn)生,而Go版本號(hào)和編譯時(shí)間只有在編譯時(shí)才能拿到。

比較合理的做法是在編譯時(shí)注入。Go編譯工具提供了-ldflags選項(xiàng),通過-X參數(shù)可以注入包變量的值,我們只需要在代碼中將版本信息定義成包變量,然后在編譯時(shí)完成注入即可。這個(gè)過程可以實(shí)現(xiàn)為自動(dòng)化完成,下面以make工具為例說明。

實(shí)現(xiàn)步驟

1. 在代碼中定義版本信息的變量

將代碼版本號(hào)、Git提交號(hào)、編譯時(shí)間定義為包變量:

package config
var (
	Version   string  //代碼版本號(hào)
	GitCommit string  //Git提交號(hào)
	BuildTime string  //編譯時(shí)間
)

Go版本號(hào)等信息可以借助runtime包獲取:

runtime.Version()  //Go版本
runtime.GOOS       //操作系統(tǒng)
runtime.GOARCH     //平臺(tái)架構(gòu)

2. 在代碼中使用這些變量

1)實(shí)現(xiàn)--version參數(shù)或version子命令

Cobra命令行框架為例,為rootCmd實(shí)現(xiàn)--version參數(shù):

rootCmd.Version = config.Version
rootCmd.SetVersionTemplate(fmt.Sprintf(`{{with .Name}}{{printf "%%s version information: " .}}{{end}}
    {{printf "Version:    %%s" .Version}}
    Git Commit: %s
    Build Time: %s
    Go version: %s
    OS/Arch:    %s/%s
`, config.GitCommit, config.BuildTime, runtime.Version(), runtime.GOOS, runtime.GOARCH))

2)實(shí)現(xiàn)/version接口

Gin框架為例,將/version路由到如下的Version函數(shù):

func Version(ctx *gin.Context) {
    ctx.Writer.Header().Set("Content-Type", "application/json")
    ctx.Writer.WriteHeader(http.StatusOK)
    json.NewEncoder(ctx.Writer).Encode(map[string]string{
        "version":    config.Version,
        "Git Commit": config.GitCommit,
        "Build Time": config.BuildTime,
        "Go Version": runtime.Version(),
        "OS/Arch":    runtime.GOOS + "/" + runtime.GOARCH,
    })
}

3. 在編譯前獲取版本信息

在Makefile中,用git命令獲取代碼版本號(hào)、Git提交號(hào),用date命令獲取當(dāng)前時(shí)間

VERSION    = $(shell git describe --tags --always)
GIT_COMMIT = $(shell git rev-parse --short HEAD)
BUILD_TIME = $(shell date -R)

4. 在編譯時(shí)注入版本信息

在Makefile中,通過-ldflags選項(xiàng)為go build命令傳入編譯參數(shù),實(shí)現(xiàn)版本信息的注入

define LDFLAGS
"-X 'github.com/myname/myapp/config.Version=${VERSION}' \
-X 'github.com/myname/myapp/config.GitCommit=${GIT_COMMIT}' \
-X 'github.com/myname/myapp/config.BuildTime=${BUILD_TIME}'"
endef
build:
    go build -ldflags ${LDFLAGS} -o myapp_${VERSION} .

5. 驗(yàn)證效果

編譯出二進(jìn)制,即可驗(yàn)證--version參數(shù);用二進(jìn)制啟動(dòng)服務(wù)進(jìn)程,即可驗(yàn)證/version接口。

$ make build
...
//編譯過程,省略輸出
$ myapp --version
myapp version information: 
    Version:    0.9.2
    Git Commit: b554659
    Build Time: Sat, 17 Jun 2023 11:30:44 +0800
    Go version: go1.20.5
    OS/Arch:    darwin/arm64
$ myapp
...
//啟動(dòng)進(jìn)程,省略輸出
$ curl http://127.0.0.1:8080/version | jq
{
  "Build Time": "Sat, 17 Jun 2023 11:30:44 +0800",
  "Git Commit": "b554659",
  "Go Version": "go1.20.5",
  "OS/Arch": "darwin/arm64",
  "version": "0.9.2"
}

總結(jié)

二進(jìn)制文件直接帶上版本信息,能為代碼調(diào)試和問題定位帶來很大的方便。本文介紹了通過-ldflags選項(xiàng)實(shí)現(xiàn)在編譯時(shí)注入版本信息的具體做法。

這是一個(gè)比較通用的方法,很多開源軟件比如 Docker 也是這樣做的。

到此這篇關(guān)于詳解Golang如何在編譯時(shí)注入版本信息的文章就介紹到這了,更多相關(guān)Golang編譯注入版本信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go web入門Go pongo2模板引擎

    Go web入門Go pongo2模板引擎

    這篇文章主要為大家介紹了Go web編程入門Go pongo2模板引擎使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 一文掌握Go語言并發(fā)編程必備的Mutex互斥鎖

    一文掌握Go語言并發(fā)編程必備的Mutex互斥鎖

    Go 語言提供了 sync 包,其中包括 Mutex 互斥鎖、RWMutex 讀寫鎖等同步機(jī)制,本篇博客將著重介紹 Mutex 互斥鎖的基本原理,需要的可以參考一下
    2023-04-04
  • golang實(shí)現(xiàn)大文件上傳功能全過程

    golang實(shí)現(xiàn)大文件上傳功能全過程

    Go語言可以用來實(shí)現(xiàn)大文件傳輸,下面這篇文章主要給大家介紹了關(guān)于golang實(shí)現(xiàn)大文件上傳功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Minio基本介紹及如何搭建Minio集群

    Minio基本介紹及如何搭建Minio集群

    MinIO主要采用Golang語言實(shí)現(xiàn),客戶端與存儲(chǔ)服務(wù)器之間采用http/https通信協(xié)議,本文重點(diǎn)給大家介紹什么是Minio?如何搭建Minio集群?感興趣的朋友一起看看吧
    2022-06-06
  • 深入了解Golang為什么需要超時(shí)控制

    深入了解Golang為什么需要超時(shí)控制

    本文將介紹為什么需要超時(shí)控制,然后詳細(xì)介紹Go語言中實(shí)現(xiàn)超時(shí)控制的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • Golang語言中切片的長(zhǎng)度和容量的概念和使用

    Golang語言中切片的長(zhǎng)度和容量的概念和使用

    這篇文章主要介紹了Golang語言中切片的長(zhǎng)度和容量的概念和使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • go實(shí)現(xiàn)限流功能示例

    go實(shí)現(xiàn)限流功能示例

    這篇文章主要為大家介紹了go實(shí)現(xiàn)限流功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Golang第三方庫(kù)robfig/cron定時(shí)器庫(kù)用法小結(jié)

    Golang第三方庫(kù)robfig/cron定時(shí)器庫(kù)用法小結(jié)

    robfig/cron是Golang生態(tài)中最常用的定時(shí)器庫(kù)之一,實(shí)現(xiàn)了標(biāo)準(zhǔn)的Unix Cron表達(dá)式解析與任務(wù)調(diào)度功能,本文就來詳細(xì)的介紹一下第三方庫(kù)robfig/cron定時(shí)器庫(kù)用法,感興趣的可以了解一下
    2026-04-04
  • Go快速開發(fā)一個(gè)RESTful API服務(wù)

    Go快速開發(fā)一個(gè)RESTful API服務(wù)

    這篇文章主要為大家介紹了Go快速開發(fā)一個(gè)RESTful API服務(wù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • golang連接kafka的示例代碼

    golang連接kafka的示例代碼

    本文主要介紹了golang連接kafka的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

蛟河市| 高尔夫| 浦江县| 岳普湖县| 秦皇岛市| 寻乌县| 湟中县| 无棣县| 上杭县| 巧家县| 峨眉山市| 新河县| 鹤峰县| 湘西| 扎囊县| 邵阳市| 庐江县| 桑植县| 潢川县| 黑水县| 台州市| 张家川| 万荣县| 故城县| 石门县| 麻阳| 衡阳市| 镇平县| 苏州市| 宿州市| 吐鲁番市| 龙胜| 焉耆| 易门县| 阿克苏市| 靖远县| 元朗区| 汽车| 遂昌县| 珲春市| 岢岚县|