go build -X 的妙用
不知道大家还记不记得,上次发了一篇关于 panic 检测机器人的文章,原理非常简单,简单回顾一下:
业务服务在 recover 函数里通过 HTTP 请求的方式向机器人上报 panic 栈信息。
机器人解析出 panic 栈里的代码行号,调用 gitlab 接口拿到该行代码的提交人、提交日期等信息。
当然,后面我又给机器人增加了一些其他的功能,例如自动拉群,自动提醒相关人修复 panic 代码等……
上面说的这些其实都很好实现,主要就是和飞书 API 打交道,再加上一些逻辑串连一下流程。目前机器人上报了 1000+ 次 panic,工作状态良好。
但偶尔还是有一些小问题的存在,例如有人用开发分支(非 master)上到线上测试环境(只读环境)测试一把,这时机器人还是用 master(默认)分支请求 gitlab 接口拿 commit 信息,拿到的信息就有可能不准。
那有没有什么好的方法能拿到正在运行的进程的代码分支呢?如果能拿到,机器人用代码路径+代码行号+代码分支,就可以从 gitlab 拿到正确的 commit 信息。
答案是有,通过 go build -X
注入。
那具体怎么玩的呢,通过一个小例子来说明。
下面是 build.sh
的代码:
#!/bin/shCOMMIT_ID=`git log |head -n 1| awk '{print $2;}'`
AUTHOR=`git log |head -n 3| grep Author| awk '{print $2;}'`
BRANCH_NAME=`git branch | awk '/\*/ { print $2; }'`
SERVICE_INFO="$COMMIT_ID,$AUTHOR,$BRANCH_NAME"
echo $SERVICE_INFO
go build -ldflags "-X codebase/build-x/compile_info.ServiceInfo=$SERVICE_INFO" -o output/bin/build
第 3、4、5 行分别用 git 命令拿到本次提交的 commit-id,author,分支名;第 6 行用 “,” 将三者组合成一个字符串;第 8 行用 go build
命令,设置 ldflags,将变量 $SERVICE_INFO
注入到包变量 codebase/build-x/compile_info.ServiceInfo
,这样在 Go 代码中就可以直接用了。
再看看我的 compile_info 包的代码,非常简单,就定义了一个变量:
package compile_infovar ServiceInfo string
执行完 go build
命令后,compile_info.ServiceInfo 就会被赋上值,在 main 函数里打印一下:
package mainimport ("fmt""codebase/build-x/compile_info"
)func init() {fmt.Println("init: ", compile_info.ServiceInfo)
}func main() {fmt.Println(compile_info.ServiceInfo)
}
先执行:
sh build.sh
再执行:
~/go/src/codebase/build-x$ ./output/bin/build
得到运行结果:
init: 9699dcaae31e7e5eab55a1d75283a6d7158a64e8,raoquancheng,master
9699dcaae31e7e5eab55a1d75283a6d7158a64e8,raoquancheng,master
可知,在 init 函数里我们就可以拿到 compile_info.ServiceInfo 的值了。
代码文件结构如下:
原理也没啥可探究的,就是通过 -ldflags 给链接器传参数:
-X definition: 添加形式为 importpath.name=value 的字符串值定义
其他的一些常见的命令用处:
-s
的作用是去掉符号信息。-w
的作用是去掉调试信息。go build -ldflags "-s -w" -o xxx
之前看到公司项目里 build 脚本里的一些命令不知道有啥用,真正到了用的时候才惊呼:原来是这样!
今天的 go build
妙用你学会了吗?也许下次就可以在同事面前装 B 了,当然如果碰到了老司机,也可能会被打脸。
资料分享,关注公众号回复指令:
回复【加群】,和大佬们一起成长。
回复【000】,下载一线大厂简历模板。
回复【001】, 送你 Go 开源电子书。
go build -X 的妙用相关推荐
- SpringBoot2.x Nacos RocketMQ 事务消息
需求背景: 现在有内容中心(content-center)和 用户中心(user-center)2个微服务,请求内容中心,发送消息给用户中心,完成为指定用户添加积分操作. 文章目录 一.准备工作 1. ...
- 三消也玩策略?这款游戏没那么简单——《妙连千军》
在笔者的印象中,最开始接触三消类作品(Match 3)还是在早期的8bit机上,那是红遍一时的<马里奥医生>.玩家通过堆积色泽相同的胶囊,以此做到消灭瓶子中对应色泽的病菌.这种好似< ...
- httpclient妙用一 httpclient作为客户端调用soap webservice(转)
前面有一篇使用HttpClient调用带参数的post接口方法,这里找到一篇使用HttpClient调用Soap协议接口的方式. 原文地址:httpclient妙用一 httpclient作为客户端调 ...
- 用户自定义属性表结构设计_属性类型定制及其妙用
引擎版本 4.22.0 属性类型定制简介 在介绍属性类型定制前先了解下引擎提供的默认的详细布局. 默认详细布局 只要我们的UPROEPRTY类型是值类型,编辑器系统就会在详细面板为你创建一个默认布局. ...
- 万能的APT!编译时注解的妙用
转载自:http://zjutkz.net/2016/04/07/万能的APT!编译时注解的妙用/ 本篇文章会带你了解什么是注解,注解的用法和分类,并且从knight和butterKnife的使用方式 ...
- 小团队如何妙用 JuiceFS
早些年还在 ENJOY 的时候, 就已经在用 JuiceFS, 并且一路伴随着我工作过的四家小公司, 这玩意对我来说, 已经成了理所应当不可或缺的基础设施, 对于我服务过的小团队而言, 更是实实在在的 ...
- go build 编译报错 missing go.sum entry for module providing package
go build 编译报错 missing go.sum entry for module providing package 解决方法 // 移除未使用的依赖 go mod tidy 再次编译,就可 ...
- 妙用postman系列——postman建组、分享
妙用postman系列--postman建组.分享 添加新的组和请求. 3.生成分享链接 4.导入分享链接
- relay.build调用关系
relay.build调用关系 在用TVM优化过程中,常见demo如下图: relay.build背后的调用机制梳理如下: python中的build函数实现如下,此方法实际调用了BuildModul ...
最新文章
- 程序员必备的20个软件
- 华为用MySQL还是oracle_25.Oracle和Mysql的区别
- 武汉首座无人驾驶电动汽车充电站投入使用
- Java扫描注解下的包_使用Spring mvc 利用java的反射技术,来扫描对应包下的注解请求url 统一保存在数据库中...
- go语言能编android程序吗,用 Golang 开发 Android 应用(二)—— 简单 UI-Go语言中文社区...
- neo4j 显示名字_Neo4j:绘制“我的名字是……我在工作”图
- DataGridView直接导出EXCEL
- Executor源码解读
- linux路由内核实现分析(四)---路由缓存机制(2)
- ASp.net常用服务
- (十五)洞悉linux下的Netfilteriptables:开发自己的hook函数【实战】
- Linux C编程学习之路
- FTP服务器文件下载方法
- Java编写杨辉三角
- Latex参考文献问题---参考文献条数不显示
- Google Map街景(红蓝立体)
- 十余年陪伴NS-2的心得体会
- Oracle EBS Workflow 下载/上传
- FocalLoss原理通俗解释及其二分类和多分类场景下的原理与实现
- 电脑声道,如何查看电脑声卡是几声道的?
热门文章
- windows环境下设置Redis自启动
- The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
- leetcode-125-Valid Palindrome
- linux中shell变量$#,$@,$0,$1,$2的含义解释:
- 使用Struts 2框架实现文件下载
- 10天学安卓-第九天
- mysql innodb 数据恢复
- 2021HDU多校8 - 7057 Buying Snacks(矩阵快速幂套NTT优化dp)
- CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)
- CodeForces - 1304D Shortest and Longest LIS(构造+贪心)