Go语言从入门到规范-7.2、Go编译传参传递编译时间和版本并写成交叉编译的shell脚本执行


文章目录

1. 前言

有这么个需求,我们需要添加程序的编译时间和版本,对于C语言的话直接通过宏__DATE__和__TIME__就可以获取到,但是Go目前似乎没有提供类似功能,所以在找了一番后发现了两种方式,一种就是利用C实现获取编译时间,然后通过Go调用C获取,还有一种方式就是通过ldflags传参来直接传递使用date命令获取的当前时间,目前我们采用第二种方式,这种方式稍微方便一些。

2. 实例

如下是命令:

go build -ldflags "-X main.compileDate=$(date -u +%Y%m%d.%H%M%S)

这个是例子:

package main

import "fmt"

var compileDate string
var version string

func main() {
fmt.Println(compileDate)
fmt.Println(version)
}

结果:

20210507.054329
1.0

3. 和GoLand结合

我们可以将上述命令放入shell脚本中放在源码目录下,如果是安装有GoLand开发工具的话,可以通过GoLand打开,并安装shell Script插件的话,会提示是否扩展Shell Check,扩展后会对shell进行检测,检测后可以直接执行脚本,这样后续就不用重复执行编译命令了,需要修改软件版本的话直接修改该脚本即可。

Go语言从入门到规范-7.2、Go编译传参传递编译时间和版本并写成交叉编译的shell脚本执行_shell脚本

4. 写交叉编译的shell脚本

如上,我们写到shell脚本中执行即可获取编译时间和版本,GoLand暂时似乎无法配置这么复杂的编译参数。此外,我们可能需要设置环境变量用来交叉编译,结果如下(win10目前/bin/sh可以执行shell脚本,而GoLand可以直接执行我们写好的shell脚本):

export GOARCH="arm"
echo $GOARCH
export GOOS="linux"
echo $GOOS
go build -ldflags "-X main.compileDate=$(date -u +%Y%m%d.%H%M%S)

结果:

$/bin/sh xxx/compile.sh
arm
linux

并且生成了我们需要的交叉编译的程序。