详解如何在Go项目中输出版本信息

我们经常在使用CLI工具的时候,都会有这样的参数输出:

➜ ~ 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
➜ ~

可以打印出构建时对应的版本信息,比如 Version,Go Version,Git Commit等,这个是如何实现的呢?

实现

主要是通过ldflags参数来实现在构建的时候对变量进行赋值。

比如下面一段代码:

package main

import (
 "flag"
 "fmt"
 "os"
)

//需要赋值的变量
var version = ""

//通过flag包设置-version参数
var printVersion bool

func init() {
 flag.BoolVar(&printVersion, "version", false, "print program build version")
 flag.Parse()
}

func main() {
 if printVersion {
  println(version)
  os.Exit(0)
 }
 fmt.Printf("example for print version")
}

构建命令:

go build -ldflags "-X main.version=v0.1" -o example

程序输出:

➜ ./example
version=v0.1

参数说明

1、-ldflags build命令中用于调用接链接器的参数

-ldflags '[pattern=]arg list'
 arguments to pass on each go tool link invocation.

2、-X 链接器参数,主要用于设置变量

-X importpath.name=value
 Set the value of the string variable in importpath named name to value.
 Note that before Go 1.5 this option took two separate arguments.
 Now it takes one argument split on the first = sign.

一个完整的例子

这里将version包单独做了一个包存放,只需要引入即可:

package main

import (
  "flag"

  "github.com/go-demo/version"
)

//通过flag包设置-version参数
var printVersion bool

func init() {
  flag.BoolVar(&printVersion, "version", false, "print program build version")
  flag.Parse()
}

func main() {
  if printVersion {
    version.PrintVersion()
  }
}

构建的shell如下(也可以放在Makefile中):

#!/bin/sh
version="v0.1"
path="github.com/go-demo/version"
flags="-X $path.Version=$version -X '$path.GoVersion=$(go version)' -X '$path.BuildTime=`date +"%Y-%m-%d %H:%m:%S"`' -X $path.GitCommit=`git rev-parse HEAD`"
go build -ldflags "$flags" -o example example-version.go

TIPS: 如果值内容中含有空格,可以用单引号

最终版本输出:

➜ sh build.sh
➜ ./example -version
Version: v0.1
Go Version: go version go1.13.1 darwin/amd64
Git Commit: a775ecd27c5e78437b605c438905e9cc888fbc1c
Build Time: 2020-01-09 19:01:51

完整代码:https://github.com/go-demo/version

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

    简介 如果你曾经运行过 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 Experiment

  • 浅析Go语言版本的forgery

    使用过Python语言的朋友们可能使用过 forgery_py ,它是一个伪造数据的工具.能伪造一些常用的数据.在我们开发过程和效果展示是十分有用.但是没有Go语言版本的,所以就动手折腾吧. 从源码入手 在forgery_py的 PyPi 有一段的实例代码: >>> import forgery_py >>> forgery_py.address.street_address() u'4358 Shopko Junction' >>> forgery_

  • 在Golang代码中如何自动生成版本号的方法示例

    前言 以前在写C/C++代码时,可以在代码中预定义一些版本宏定义,然后再编译时从外部传入数据作为版本号. golang代码不支持宏定义,如果每次在代码中硬编码版本信息,一来费时费力,二来很容易忘记更新. 如何更优雅的维护golang程序的版本号呢? 翻阅golang文档之后,在go build发现下面的参数 -ldflags 'flag list' arguments to pass on each go tool link invocation. 然后在linker中发现: -X import

  • golang如何实现mapreduce单进程版本详解

    前言   MapReduce作为hadoop的编程框架,是工程师最常接触的部分,也是除去了网络环境和集群配 置之外对整个Job执行效率影响很大的部分,所以很有必要深入了解整个过程.元旦放假的第一天,在家没事干,用golang实现了一下mapreduce的单进程版本,github地址.处理对大文件统计最高频的10个单词,因为功能比较简单,所以设计没有解耦合.   本文先对mapreduce大体概念进行介绍,然后结合代码介绍一下,如果接下来几天有空,我会实现一下分布式高可用的mapreduce版本.

  • 详解如何在Go项目中输出版本信息

    我们经常在使用CLI工具的时候,都会有这样的参数输出: ➜ ~ 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 ➜ ~ 可以打印出构建时对应的版本信息

  • 详解如何在SpringBoot项目中使用全局异常处理

    目录 1. 创建自定义异常 2.创建全局异常处理器 3.创建测试控制器 在完整的项目开发中,异常的出现几乎是无法避免的:如果凡是有可能出现异常的地方,我们都手动的使用try-catch将其捕获的话,虽然也能达到处理异常的效果,但是这样做会使得代码显得十分臃肿并且后期不好维护,也不利于多人系统开发. 在Spring Boot中提供了统一处理异常的方法,SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用Exceptio

  • 详解如何在SpringBoot项目中使用统一返回结果

    目录 1.创建Spring Boot项目 2.返回结果的封装 3.后端接口实现 3.1 创建实体类 3.2 创建dao层 3.3 创建Controller层 4.前端部分 5.验证 在一个完整的项目中,如果每一个控制器的方法都返回不同的结果,那么对项目的维护和扩展都会很麻烦:并且现在主流的开发模式时前后端分离的模式,如果后端返回各式各样的结果,那么在前后端联调时会非常的麻烦,还会增加前后端的格外任务. 所以,在一个项目中统一返回结果就是一个十分必要和友好的做法.接下来就用一个简单的demo来看看

  • 详解如何在Vue项目中导出Excel

    Excel 导出 Excel 的导入导出都是依赖于js-xlsx来实现的. 在 js-xlsx的基础上又封装了Export2Excel.js来方便导出数据. 使用 由于 Export2Excel不仅依赖js-xlsx还依赖file-saver和script-loader. 所以你先需要安装如下命令: npm install xlsx file-saver -S npm install script-loader -S -D 由于js-xlsx体积还是很大的,导出功能也不是一个非常常用的功能,所以

  • 详解如何在vue项目中使用layui框架及采坑

    根据官网的文档,要在一个html文件下使用layui里面的组件库其实很简单,但是在vue项目中使用该ui库却存在着很多坑,下面我们就详细讲解一下如何在vue-cli搭建的项目下使用layui 1.第一个坑:vue项目中使用npm安装引入时报错(目前并没有找到引入的合适的方式,知道的可以留言探讨) 在官网中我们可以看到他提到支持npm安装,但是当我们安装成功后,在main.js中引入时却报并不能找到该模块的错. 所以,我们先下载文件包,然后在html文件中用link和script标签的方式引入 2

  • 详解如何在NodeJS项目中优雅的使用ES6

    NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加上参数:--harmony.但是,即使如此node也还是没有支持全部的ES6特性.所以这个时候就需要用到Babel了. 项目地址:https://github.com/future-challenger/petshop 现在开始Babel 在开始使用Babel之前,假设 1.你已经安装了nodejs,并且已经熟悉了Js. 2.你也可以使用n

  • 详解如何在vue项目中引入elementUI组件

    前提:已经安装好Vue 初始化vue vue init webpack itemname 运行初始化demo 运行一下初始后的demo,如果没有问题则进行安装elementUI npm run dev 安装 elementUI npm i element-ui -S 引入elementUI 在main.js中引入elementUI import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vu

  • 详解如何在vue项目中使用lodop打印插件

    项目中使用到打印的功能.领导推荐使用Lodop Lodop是什么东东,反正就是可以定制打印的插件... 既然是插件,vue的渐进式开发.完全可以拿来化为己用. 如何使用那?先大概看了下开发文档,就是一堆demo,一个js文件,三个安装程序,我擦,这么简单.come on 电脑安装C-Lodop,就可以打印预览来了. 开工,翻来覆去就一个LodopFuncs.js是干货,扔到项目中.就差怎么调里面的方法了. 如何引用,当然得改造喽 LodopFuncs.js 方法改造如下 //====判断是否需要

  • 详解如何在Vue项目中发送jsonp请求

    起因 公司临时要支撑河南的一个项目,做一个单点登录的功能. 简单来说,就是以下3步 客户方点击某个按钮进入我们的页面a 在页面a中由前端发送一个jsonp请求到客户方,得到一个token值 前端得到token值后向自己后端发送一个请求,后端根据token去redis(token的值就是redis里的key)里取值(key=token的值,value=用户信息等)判断用户是否已登陆,若登陆则根据取到的工号等信息后端模拟登陆,若没有登陆,则跳转到客户方登陆页面 怎么做 发送jsonp请求,axios

  • 详解如何在vue项目中使用eslint+prettier格式化代码

    对于前端代码风格这个问题一直是经久不衰,每个人都有自己的代码风格,每次看到别人代码一团糟时候我们都会吐槽下.今天给大家介绍如何使用eslint+prettier统一代码风格. 对于eslint大家应该比较了解了,是用来校验代码规范的.给大家介绍下prettier,prettier是用来统一代码风格,格式化代码的,支持js.ts.css.less.scss.json.jsx.并且集成了vscode.vim.webstorm.sublime text插件. 如果你的项目中采用的是ellint默认规则

随机推荐