先看效果
1 | ./myapp -v |
myapp 是一个演示用的 demo 程序,输入 -v 参数运行时,打印出程序的一些信息。以上信息对应的说明如下:
1 | # GitCommitLog |
ok,下面就来介绍是如何实现的。
依赖的知识点
Go 语言编译时,可以通过 go build -ldflags 的方式向程序中指定的包中的变量传递值。
拿下面这个十来行的程序做个演示:
1 | package main |
如果直接使用 go build 编译,运行的结果是 Foo is empty.。
如果使用 go build -ldflags "-X 'main.Foo=test'" 编译,则运行的结果为 Foo=test。它的格式为 -X '<包名>.<变量名>=<值>'
编译期将感兴趣的信息传入程序中
通过上面这种手法,我们可以编写一个用于编译 Go 程序的 shell 脚本,在脚本中获取一些编译时期的信息,传递到程序中。
比如:
1 | 获取源码最近一次 git commit log,包含 commit sha 值,以及 commit message |
更进一步
其实前面也提到, Go 不仅仅支持在编译时向 main 包中的变量传递值,也支持向非 main 包传递。
基于以上前提,为了以后写不同应用程序时,减少模板代码的拷贝,我专门写了一个 package (package bininfo github地址),代码如下:
1 | package bininfo |
然后我们用一个 demo 程序 myapp.go 来演示如何使用,代码如下:
1 | package main |
最后,是我们的 build.sh 脚本,源码如下:
1 | !/usr/bin/env bash |
写在最后
本文中的 package bininfo,编译脚本,示例代码都在我的 github 项目 naza (https://github.com/q191201771/naza) 中。
这个仓库包含了我平时学习 Go 练手写的一些基础库代码。有些已经在我的线上服务中使用了。后续我还会写一些文章介绍这个仓库中的其他包。
感谢阅读,如果觉得文章还不错的话,顺手给我的 github 项目 来个 star 就更好啦。 :)
本文完,作者yoko,尊重劳动人民成果,转载请注明原文出处: https://pengrl.com/p/37397/