golang编译时给包内变量赋值,实现打印版本号及commit

wind5o · · 1834 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

很多命令行程序都可以通过version参数输出版本信息,commit,操作系统等信息。下面介绍一种方法实现golang编译的命令行程序打印版本号。

docker打印的版本信息:

$ ~ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false

实现方式是利用go build的一个参数-ldflags。输入go help build,可以看到一个配置项:

-ldflags 'flag list' arguments to pass on each go tool link invocation.

这个参数是用来设置go link(静态链接)的一些参数,具体有哪些参数可以通过go tool link --help查看。

其中-X参数可以在编译时给包内的变量赋值,然后我们利用flag包设置version参数就能实现打印版本号了。

main.go:

package main

import (
    "flag"
    "log"
    "os"
)

var (
    Version   string
    Branch    string
    Commit    string
    BuildTime string
    lowercase string // 小写也可以
)

func main() {
    versionFlag := flag.Bool("version", false, "print the version")
    flag.Parse()

    if *versionFlag {
        log.Printf("Version: %s\n", Version)
        log.Printf("Branch: %s\n", Branch)
        log.Printf("Commit: %s\n", Commit)
        log.Printf("BuildTime: %s\n", BuildTime)
        log.Printf("lowercase: %s\n", lowercase)
        os.Exit(0)
    }

    log.Println("run main.go")
}

打包脚本:

#!/usr/bin/env bash

prog=xxx
version=1.1.0
lowercase=ok

# 交叉编译
# CGO_ENABLED=0 GOOS=linux GOARCH=amd64
go build -ldflags "\
-X main.Version=$version \
-X main.Branch=`git rev-parse --abbrev-ref HEAD` \
-X main.Commit=`git rev-parse HEAD` \
-X main.BuildTime=`date -u '+%Y-%m-%d_%H:%M:%S'` \
-X main.lowercase=$lowercase \
" -v -o $prog main.go

最终效果:

$ ./xxx -version
2019/04/11 00:59:08 Version: 1.1.0
2019/04/11 00:59:08 Branch: master
2019/04/11 00:59:08 Commit: 29921d9df18543693321e2109ea36462dbb346d3
2019/04/11 00:59:08 BuildTime: 2019-04-10_16:59:07
2019/04/11 00:59:08 lowercase: ok

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:wind5o

查看原文:golang编译时给包内变量赋值,实现打印版本号及commit

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1834 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传