首页 > 其他分享 >golang之增加版本信息功能

golang之增加版本信息功能

时间:2023-08-24 19:33:05浏览次数:44  
标签:功能 string make echo golang json version go 版本信息

在实际开发中,当开发完一个 apiserver 特性后,会编译 apiserver 二进制文件并发布到生产环境,很多时候为了定位问题和出于安全目的(不能发错版本),我们需要知道当前 apiserver 的版本,以及一些编译时候的信息,如编译时 Go 的版本、Git 目录是否 clean,以及基于哪个 git commmit 来编译的。在一个编译好的可执行程序中,我们通常可以用类似 ./app_name -v 的方式来获取版本信息。

我们可以将这些信息写在配置文件中,程序运行时从配置文件中取得这些信息进行显示。但是在部署程序时,除了二进制文件还需要额外的配置文件,不是很方便。或者将这些信息写入代码中,这样不需要额外的配置,但要在每次编译时修改代码文件,也比较麻烦。Go 官方提供了一种更好的方式:通过 -ldflags -X importpath.name=value(详见 -ldflags -X importpath.name=value)来给程序自动添加版本信息。

 

1.增加参数-v

package main

import (
    "encoding/json"
    "fmt"
    "os"
    ...
    v "apiserver/pkg/version"
    ...
)

var (
    version = pflag.BoolP("version", "v", false, "show version info.")
)

func main() {
    pflag.Parse()
    if *version {
        v := v.Get()
        marshalled, err := json.MarshalIndent(&v, "", "  ")
        if err != nil {
            fmt.Printf("%v\n", err)
            os.Exit(1)
        }

        fmt.Println(string(marshalled))
        return
    }
    ...
}

pkg/version包中的实现:

base.go

package version

// 变量通过-ldflags -X importpath.name=value在编译时传入程序中
var (
    gitTag       = "" //
    gitBranch    = ""
    gitCommit    = "$Format:%H$"
    gitTreeState = "not a git tree"
    buildDate    = "1970-01-01T00:00:00Z"
)

version.go

package version

import (
    "fmt"
    "runtime"
)

type Info struct {
    GitTag       string `json:"gitTag"`
    GitBranch    string `json:"gitBranch"`
    GitCommit    string `json:"gitCommit"`
    GitTreeState string `json:"gitTreeState"`
    BuildDate    string `json:"buildDate"`
    GoVersion    string `json:"goVersion"`
    Compiler     string `json:"compiler"`
    Platform     string `json:"platform"`
}

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

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

其中的gitTag, gitBranch,gitComit,gitTreeState,buildDate信息都是在build的时候, 使用-ldflags -X key=value的方式指定参数

Makefile文件中:

.PHONY: all build windows mac run tidy check cert test cover lint docker clean help

BIN_FILE=golang-demo
MAIN_FILE=./cmd/app/main.go


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

# build with verison infos
versionDir = "golang-demo/pkg/version"
## 获取仓库tag
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=Asia/Shanghai 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)
gitBranch = $(shell git rev-parse --abbrev-ref HEAD)

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

# 默认执行
all: build

# 打包成二进制文件
build: tidy check
    @CGO_ENABLED=0 GOOS=linux GOARCH=amd64  go build -v -ldflags $(ldflags) -o $(BIN_FILE)_linux $(MAIN_FILE)

windows: tidy check
    @CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -v -ldflags "-w -s" -o $(BIN_FILE)_windows.exe $(MAIN_FILE)

mac: tidy check
    @CGO_ENABLED=0 GOOS=darwin GOARCH=amd64  go build -v -ldflags "-w -s" -o $(BIN_FILE)_darwin $(MAIN_FILE)

# 启动服务
run:
    @go run $(MAIN_FILE) -c ./config/config.yaml


tidy:
    @go mod tidy


# 代码验证
check:
    @gofmt -s -w ./
    @go vet $(MAIN_FILE)

cert:
    @openssl req -new -nodes -x509 -out config/server.crt -keyout config/server.key -days 3650 -subj "/C=DE/ST=NRW/L=Earth/O=Random Company/OU=IT/CN=127.0.0.1/[email protected]"



# 单元测试
test:
    @go test ./...

# 覆盖测试
cover:
    @go test -coverprofile xx.out
    @go tool cover -html=xx.out

lint:
    @golangci-lint run --enable-all


docker:
    @docker build -t golang-demo:latest .

clean:
    @go clean -x
    rm -f "xx.out"


help:
    @echo "make - 格式化go代码 并编译生成二进制文件"
    @echo "make test - 执行测试case"
    @echo "make check - 代码检查"
    @echo "make cover - 检测测试覆盖率"
    @echo "make run - 启动服务"
    @echo "make lint - 执行代码检查"
    @echo "make docker - 生成Docker镜像"
    @echo "make clean - 清理中间目标文件"
    @echo "make build - 编译成二进制文件(默认:Linux)"
    @echo "make windows - 编译成二进制文件(Windows)"
    @echo "make mac - 编译成二进制文件(Mac)"

# include ./TestMakefile 包含其他Makefile

-w:  去除调试信息, 无法使用gdb调试, 但是二进制文件更小

 

执行./golang-demo -v

{
        "gitTag": "d62a870",
        "gitBranch": "master",
        "gitCommit": "d62a87056066b2f8ecf6caf64b3bd1d80d60a5e1",
        "gitTreeState": "dirty",
        "buildDate": "2023-08-24T17:10:45+0800",
        "goVersion": "go1.20.7",
        "compiler": "gc",
        "platform": "linux/amd64"
}

 

标签:功能,string,make,echo,golang,json,version,go,版本信息
From: https://www.cnblogs.com/xingxia/p/golang_version.html

相关文章

  • Winter '24发布在即,Salesforce Flow中的最热功能不容错过!
    FlowBuilder作为自动化领域的新秀,它在功能方面已经远远超过WorkflowRules和ProcessBuilder,随着WorkflowRules和ProcessBuilder的退役,目前所有自动化都需要迁移到Flow。Winter'24发布在即,Flow中的亮点功能不容错过!一起来先睹为快吧~01在Record-TriggeredFlow中创建自定......
  • 八月更新 | CI 构建计划触发机制升级、制品扫描 SBOM 分析功能上线!
    点击链接了解详情这个八月,腾讯云CODINGDevOps对持续集成、制品管理、项目协同、平台权限等多个产品模块进行了升级改进,为用户提供更灵活便捷的使用体验。以下是CODING新功能速递,快来看看是否有您期待已久的功能特性:01CI构建计划触发机制升级在原有代码变更及合并请求......
  • 视频云存储/安防监控视频智能分析网关V3:占道经营功能详解
    违规占道经营者经常会在人流量大、车辆集中的道路两旁摆摊,导致公路交通堵塞,给居民出行的造成不便,而且违规占路密集的地方都是交通事故频频发生的区域。TSINGSEE青犀视频云存储/安防监控视频/AI智能分析网关V3运用视频+AI智能分析技术,实现对城市管理中违规、违法事件实时监控监......
  • golang init函数、defer函数、匿名函数、错误处理
    1.init每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在main函数前被调用,当有全局变量跟main函数init函数同时出现的时候执行的顺序是全局函数==》init函数==》main函数packagemainimport"fmt"functest()string{ r......
  • 浅谈视频汇聚平台EasyCVR中AI中台的应用功能
    AI中台是将人工智能技术如深度学习、计算机视觉、知识图谱、自然语言理解等模块化,集约硬件的计算能力、算法的训练能力、模型的部署能力、基础业务的展现能力等人工智能能力,结合中台的数据资源,封装成整体中台系统。在EasyCVR视频共享融合云平台中,AI中台是专门提供人工智能视频......
  • Golang 需要注意的知识点
    云笔记链接地址 go的协程轻量级体现在哪(1)goroutine是轻量级的用户态线程,上下文切换代价小go将goroutine的调度维持在用户态常规线程切换会导致用户态程序代码和内核态操作系统调度程序的切换只涉及PC(程序计数器,标记当前执行的代码的位置)SP(当前执行的函数堆栈栈......
  • java实现大文件上传功能
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • SQL Server 2022新功能概览
     开始之前  本篇文章仅仅是针对SQL Server 2022新推出功能的概览,以及我个人作为用户视角对于每个功能的理解,有些功能会结合一些我的经验进行描述,实际上,SQL Server 2022在引擎层面的增强的确算是里程碑级别,涉及到的每一个功能点展开都可以单独开出一篇文章。但本篇文章只......
  • IntersectionObserver 实现图片懒加载、列表无限滚动等功能
    过去,要检测一个元素是否可见或者两个元素是否相交并不容易,比如实现图片懒加载、内容无限滚动等功能时,都需要通过​getBoundingClientRect()​写大量的逻辑计算或者依靠scroll事件监听等性能很差方式来实现。现在,依靠IntersectionObserver(交叉观察器)我们能非常便捷且高效的实现上......
  • Rewrite功能配置
    目录"地址重写"与"地址转发"Rewrite规则set指令Rewrite常用全局变量if指令break指令return指令rewrite指令rewrite_log指令Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。注意:Nginx服务器的Rewrite功能的实现依......