Go:编译构建时 ldflags 变量注入
Go:编译构建时 ldflags 变量注入
1.变量注入
Go在编译构建时,可以注入变量,例如:
package mainimport "fmt"var Version = "0.0.1"func main() {fmt.Println(Version)
}
case 1:不注入变量
$ go build -o main main.go
$ ./main
0.0.1
case 2:注入变量
$ go build -ldflags "-X main.Version=0.0.9" -o main main.go
$ ./main
0.0.9
可以观察到,在编译构建可执行文件时,通过命令,注入main包的Version变量值。
2.常用形式
在编译构建时注入变量,常常用于可执行文件版本等信息的构建。
举例如下:
2.1.目录结构
$ tree project/
project/
|-- go.mod
|-- main.go
|-- Makefile
|-- path
| `-- to
| `-- package
| `-- test1280.go
`-- VERSION3 directories, 5 files
2.2.文件内容
go.mod
module gitlab.test1280.com/group/projectgo 1.16
main.go
package mainimport ("flag""fmt"_package "gitlab.test1280.com/group/project/path/to/package""os"
)func main() {// show versionvar v boolflag.BoolVar(&v, "v", false, "Show Version")flag.Parse()if v {fmt.Printf("Version : %s\n", _package.Version)fmt.Printf("Go Version : %s\n", _package.GoVersion)fmt.Printf("Built : %s\n", _package.Built)fmt.Printf("Git Commit : %s\n", _package.GitCommit)fmt.Printf("OS/Arch : %s\n", _package.OSArch)os.Exit(0)}fmt.Println("main run ...")
}
Makefile
# 可执行文件
BIN = project##########################################################################################
#
# 注入变量区
#
# 软件版本
VERSION = `cat VERSION`
# 语言版本
GOVERSION = `go env GOVERSION`
# 构建时刻
BUILT = `date "+%F %T"`
# 哈希摘要
GITCOMMIT = `git rev-parse HEAD`
# 架构信息
OSARCH = `go env GOOS`/`go env GOARCH`
# 注入变量
LDFLAGS = "\-X 'gitlab.test1280.com/group/project/path/to/package.Version=${VERSION}' \-X 'gitlab.test1280.com/group/project/path/to/package.GoVersion=${GOVERSION}' \-X 'gitlab.test1280.com/group/project/path/to/package.Built=${BUILT}' \-X 'gitlab.test1280.com/group/project/path/to/package.GitCommit=${GITCOMMIT}' \-X 'gitlab.test1280.com/group/project/path/to/package.OSArch=${OSARCH}' "
##########################################################################################project:go build -ldflags ${LDFLAGS} -o ${BIN}clean:@echo "clean ..."@rm -f ${BIN}@echo "clean OK".PHONY: project clean
test1280.go
package _package// 构建时 -ldflags -X 注入初始化
var (Version stringGoVersion stringBuilt stringGitCommit stringOSArch string
)
VERSION
1.2.3
2.3.版本控制
project 目录是一个 git repo:
$ git log
commit b93b2333426605484e4d03057fd3491b8b117047
Author: xxx <xxx@xxx.com>
Date: Thu Mar 17 16:19:21 2022 +0800init repo
2.4.测试运行
通过 make 命令按照 Makefile 规则编译构建:
$ make
go build -ldflags " -X 'gitlab.test1280.com/group/project/path/to/package.Version=`cat VERSION`' -X 'gitlab.test1280.com/group/project/path/to/package.GoVersion=`go env GOVERSION`' -X 'gitlab.test1280.com/group/project/path/to/package.Built=`date "+%F %T"`' -X 'gitlab.test1280.com/group/project/path/to/package.GitCommit=`git rev-parse HEAD`' -X 'gitlab.test1280.com/group/project/path/to/package.OSArch=`go env GOOS`/`go env GOARCH`' " -o project
可执行文件 project 已生成:
$ ll
total 2076
-rw-rw-r-- 1 jiang jiang 50 Mar 17 15:23 go.mod
-rw-rw-r-- 1 jiang jiang 531 Mar 17 16:08 main.go
-rw-rw-r-- 1 jiang jiang 1085 Mar 17 16:00 Makefile
drwxrwxr-x 3 jiang jiang 16 Mar 17 15:34 path
-rwxrwxr-x 1 jiang jiang 2105590 Mar 17 16:21 project
-rw-rw-r-- 1 jiang jiang 5 Mar 17 15:42 VERSION
测试:
$ ./project -v
Version : 1.2.3
Go Version : go1.16.2
Built : 2022-03-17 16:21:05
Git Commit : b93b2333426605484e4d03057fd3491b8b117047
OS/Arch : linux/amd64
Go:编译构建时 ldflags 变量注入相关推荐
- Open Harmony移植:build lite编译构建过程
本文分享自华为云社区<移植案例与原理 - build lite编译构建过程>,作者: zhushy. 配置完毕产品解决方案.芯片开发板解决方案,就可以执行 hb build进行编译.但是产 ...
- HarmonyOS之深入解析编译构建的配置和代码混淆
一.概述 编译构建是将 HarmonyOS 应用的源代码.资源.第三方库等打包生成 HAP 或者 APP 的过程.其中,HAP 可以直接运行在真机设备或者模拟器中:APP 则是用于应用上架到华为应用市 ...
- 一些编译php时的configure 参数
一些编译php时的configure 参数 ./configure –prefix=/usr/local/php php 安装目录 –with-apxs2=/usr/local/apache/bin/ ...
- Makefile:GCC CFLAGS变量和LDFLAGS变量
LOCAL_CFLAGS参数说明 其实 CFLAGS += -D__MT2625_ENABLED__ 这个CFLAGS是gcc编译的选项,在makefile中用CFLAGS这个变量来表示这个编译选项. ...
- Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot
Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot 一.下载u-boot源码 git clone https://git ...
- Elasticsearch6.1.2源码下载和编译构建
为了深入学习elasticsearch,研究其源码是种有效途径,本文简述了从下载到编译构建再运行起来的全部过程: 环境信息 操作系统:Ubuntu 18.04.2 LTS JDK:1.8.0_191 ...
- gcc 编译相关CFLAGS LDFLAGS LIB
CFLAGS 表示用于 C 编译器的选项, CXXFLAGS 表示用于 C++ 编译器的选项. 这两个变量实际上涵盖了编译和汇编两个步骤. CFLAGS: 指定头文件(.h文件)的路径,如:CFLAG ...
- OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!
自从OpenHarmony更新了dev-tool,就可以在windows下构建鸿蒙(轻量型)系统了,这对于进行MCU开发的朋友们,学习鸿蒙OS会友好许多!我们可以更快的构建出系统,方便快速学习和验证. ...
- [问题]DotNet 项目如何实现在构建时 Build 号自动增加?
[问题]DotNet 项目如何实现在构建时 Build 号自动增加? 继续昨天的问题,今天在Google上找了一下,没有找到很好的方案. 目前找到的解决方案有以下几种: 1.使用一个地三方的 VS.N ...
最新文章
- 在CentOS/Debian/Ubuntu上编译安装最新版 GCC 8 , cmake 3 和ninja
- python中的pandas怎么安装_如何优雅的安装Python的pandas?
- ShaderToy效果学习(转成Unity URP) - MathEye
- JS 实现 jQuery的$(function(){});
- SpringMVC:400 Bad Request
- python语法学习第六天--集合
- android---gettag()与settag()的妙用
- 190613每日一句
- Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
- C++中多线程并发介绍
- spring常用注解使用讲解
- 模拟人生3显示服务器,模拟人生3服务器初始化失败
- Qt C++ 运算符重载详解
- spss python_ARIMA模型 - [SPSS Python]
- 阿里云学生白嫖的服务器有什么用处?
- 深耕物料处理赛道,宏工科技助力涂料绿色自动化生产
- 查找技术:有序表的对分查找(折半查找)类
- 计算机ei浏览器没有了,ie浏览器不见了_我的电脑桌面上怎么IE浏览器没有了啊...
- 存储过程和存储函数的关系及使用方法
- 【EMC基础篇①】噪声是什么?EMC是什么?噪声损害是电子社会的现代病