微芒网站建设,h5开发工具有哪些,中国经济网官网,做盗版网站 国外服务器本文介绍如何在构建时使用ldflags选项给Golang应用程序注入变量#xff0c;用于给Go可执行文件增加版本标识或GIT提交摘要等信息。 应用程序的版本信息
我们首先查看Docker Cli 包含的提交信息#xff1a; docker version 返回结果#xff1a;
Server: Docker Engine - Co… 本文介绍如何在构建时使用ldflags选项给Golang应用程序注入变量用于给Go可执行文件增加版本标识或GIT提交摘要等信息。 应用程序的版本信息
我们首先查看Docker Cli 包含的提交信息 docker version 返回结果
Server: Docker Engine - CommunityEngine:Version: 23.0.1API version: 1.42 (minimum version 1.12)Go version: go1.19.5Git commit: bc3805aBuilt: Thu Feb 9 19:46:56 2023OS/Arch: linux/amd64Experimental: false
可以看到包含了 Git commit: bc3805a 信息这是git最后提交的版本信息。
那为什么要增加版本信息呢通过该信息可以很方便识别用户正在使用的版本以及已使用的时长。
Git提交日志
在进入主题之前让我们思考下在构建时注入什么信息有意义它可以是任何信息如提供WEB服务的主机名称或更常见的GIT最后提交ID。下面简单演示下如何获取GIT最后提交日志的ID。
$ git init echo lets work with git readme git add . git commit -m initial Initialized empty Git repository in C:/Users/86137/Desktop/test/.git/ warning: LF will be replaced by CRLF in readme. The file will have its original line endings in your working directory [master (root-commit) b446263] initial 1 file changed, 1 insertion() create mode 100644 readme $ ls readme $ cat readme let’s work with git $ echo lets keep working readme git add . git commit -m first update warning: LF will be replaced by CRLF in readme. The file will have its original line endings in your working directory [master b7a900c] first update 1 file changed, 1 insertion() $ cat readme let’s work with git let’s keep working 现在我们查看GIT两次提交日志
$ git log commit b7a900cdbb23493c4d48d009173daf9eb4b4e9d0 (HEAD - master) Author: test testgmail.com Date: Sat Mar 11 15:30:16 2023 0800 first updatecommit b446263cf7af8f62906587cbe97029df575ae592 Author: test testgmail.com Date: Sat Mar 11 15:29:34 2023 0800 initial通过下面命令获取最后的提交ID
$ git rev-list --all -1 b7a900cdbb23493c4d48d009173daf9eb4b4e9d0 $ export GIT_COMMIT$(git rev-list --all -1) echo $GIT_COMMIT b7a900cdbb23493c4d48d009173daf9eb4b4e9d0 示例Go应用
让我们使用简单的Hello World吧
package mainimport (fmt
)func main() {fmt.Println(Hello world)
}为了传入构建时变量需要main包中拆改那就一个变量这里命名为GitCommit:
package mainimport (fmt
)var GitCommit stringfunc main() {fmt.Printf(Hello world, version: %s\n, GitCommit)
}编译并运行
$ go build main.go ./main.exe Hello world, version: 版本信息为空下面开始注入版本给GitCommit变量。
使用-ldflags
现在我们给 go build命令增加选项传入git最后提交ID作为版本信息先看看提交情况
$ git log
commit 1111c009f3caf4730bd31a4226d5a36e4b5a0083 (HEAD - master)
Author: test testgmail.com
Date: Sat Mar 11 15:53:57 2023 0800增加GIT_COMMIT变量commit b7a900cdbb23493c4d48d009173daf9eb4b4e9d0
Author: test testgmail.com
Date: Sat Mar 11 15:30:16 2023 0800first updatecommit b446263cf7af8f62906587cbe97029df575ae592
Author: test testgmail.com
Date: Sat Mar 11 15:29:34 2023 0800initial
ldflags的语法
go build -ldflags-X package_path.variable_namenew_value可以一次性指定多个变量。
现在利用前面的知识增加最后提交ID:
go build -ldflags -X main.GitCommit$(git rev-list --all -1) main.go
执行程序可以看到版本信息
$ ./main.exe Hello world, version: 1111c009f3caf4730bd31a4226d5a36e4b5a0083 当然我们还可以增加多个变量
package mainimport (fmt
)var GitCommit string
var BuildTime string
var BuildUser stringfunc main() {fmt.Printf(Hello world, version: %s\n, GitCommit)fmt.Println(build.Time:\t, BuildTime)fmt.Println(build.User:\t, BuildUser)
}go build -ldflags -X main.GitCommit$(git rev-list --all -1) -X main.BuildUser$(id -u -n) -X main.BuildTime$(date %F_%T) main.go
运行程序 Hello world, version: 1111c009f3caf4730bd31a4226d5a36e4b5a0083 build.Time: 2023-03-11_16:36:50 build.User: 86137 压缩可执行文件
我们还可以利用 -ldflags “-s -w” 选项压缩可执行文件
go build -ldflags “-X main.GitCommit(gitrev−list−−all−1)−X′main.BuildUser(git rev-list --all -1) -X main.BuildUser(gitrev−list−−all−1)−X′main.BuildUser(id -u -n)’ -X ‘main.BuildTime$(date %F_%T)’ -s -w” main.go
对比编译前后文件的大小
# 压缩前大约1.9M
-rwxr-xr-x 1 86137 197609 1965056 3月 11 16:37 main.exe*# 压缩后为大约1.3M
-rwxr-xr-x 1 86137 197609 1338880 3月 11 16:58 main.exe*总结
本文介绍了git提交日志如何在构建时给Go程序增加信息如GIT提交日志、编译时间等信息。最后还顺便介绍了压缩可执行文件的选项。