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 变量注入相关推荐

  1. Open Harmony移植:build lite编译构建过程

    本文分享自华为云社区<移植案例与原理 - build lite编译构建过程>,作者: zhushy. 配置完毕产品解决方案.芯片开发板解决方案,就可以执行 hb build进行编译.但是产 ...

  2. HarmonyOS之深入解析编译构建的配置和代码混淆

    一.概述 编译构建是将 HarmonyOS 应用的源代码.资源.第三方库等打包生成 HAP 或者 APP 的过程.其中,HAP 可以直接运行在真机设备或者模拟器中:APP 则是用于应用上架到华为应用市 ...

  3. 一些编译php时的configure 参数

    一些编译php时的configure 参数 ./configure –prefix=/usr/local/php php 安装目录 –with-apxs2=/usr/local/apache/bin/ ...

  4. Makefile:GCC CFLAGS变量和LDFLAGS变量

    LOCAL_CFLAGS参数说明 其实 CFLAGS += -D__MT2625_ENABLED__ 这个CFLAGS是gcc编译的选项,在makefile中用CFLAGS这个变量来表示这个编译选项. ...

  5. Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot

    Mastering Embedded Linux Programming 学习 (二)在百问网157开发板上,编译构建u-boot 一.下载u-boot源码 git clone https://git ...

  6. Elasticsearch6.1.2源码下载和编译构建

    为了深入学习elasticsearch,研究其源码是种有效途径,本文简述了从下载到编译构建再运行起来的全部过程: 环境信息 操作系统:Ubuntu 18.04.2 LTS JDK:1.8.0_191 ...

  7. gcc 编译相关CFLAGS LDFLAGS LIB

    CFLAGS 表示用于 C 编译器的选项, CXXFLAGS 表示用于 C++ 编译器的选项. 这两个变量实际上涵盖了编译和汇编两个步骤. CFLAGS: 指定头文件(.h文件)的路径,如:CFLAG ...

  8. OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!

    自从OpenHarmony更新了dev-tool,就可以在windows下构建鸿蒙(轻量型)系统了,这对于进行MCU开发的朋友们,学习鸿蒙OS会友好许多!我们可以更快的构建出系统,方便快速学习和验证. ...

  9. [问题]DotNet 项目如何实现在构建时 Build 号自动增加?

    [问题]DotNet 项目如何实现在构建时 Build 号自动增加? 继续昨天的问题,今天在Google上找了一下,没有找到很好的方案. 目前找到的解决方案有以下几种: 1.使用一个地三方的 VS.N ...

最新文章

  1. 在CentOS/Debian/Ubuntu上编译安装最新版 GCC 8 , cmake 3 和ninja
  2. python中的pandas怎么安装_如何优雅的安装Python的pandas?
  3. ShaderToy效果学习(转成Unity URP) - MathEye
  4. JS 实现 jQuery的$(function(){});
  5. SpringMVC:400 Bad Request
  6. python语法学习第六天--集合
  7. android---gettag()与settag()的妙用
  8. 190613每日一句
  9. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
  10. C++中多线程并发介绍
  11. spring常用注解使用讲解
  12. 模拟人生3显示服务器,模拟人生3服务器初始化失败
  13. Qt C++ 运算符重载详解
  14. spss python_ARIMA模型 - [SPSS Python]
  15. 阿里云学生白嫖的服务器有什么用处?
  16. 深耕物料处理赛道,宏工科技助力涂料绿色自动化生产
  17. 查找技术:有序表的对分查找(折半查找)类
  18. 计算机ei浏览器没有了,ie浏览器不见了_我的电脑桌面上怎么IE浏览器没有了啊...
  19. 存储过程和存储函数的关系及使用方法
  20. 【EMC基础篇①】噪声是什么?EMC是什么?噪声损害是电子社会的现代病

热门文章

  1. WCF学习(六):实例
  2. java和python应该学哪一个,纠结?
  3. Linux命令学习之cp和mv
  4. 【数仓】数仓建模—指标体系
  5. 酒泉市委常委、政法委书记徐志强一行莅临云创参观考察
  6. Elasticsearch学习笔记:整理
  7. 结构化数据、半结构数据和非结构数据的总结
  8. 荷兰阿姆斯特丹的智慧城市:运行机制与参与者
  9. 【智能优化算法-灰狼算法】基于狩猎 (DLH) 搜索策略的灰狼算法求解单目标优化问题附matlab代码
  10. MySQL中如何使用SQL语句创建、管理索引