基于魔改Nightingale源码浅谈go语言包模块管理

写在文章开头

对于java开发而言,每一个项目完成之后都会打成一个jar包即中间层代码,所以可借由依赖包管理工具maven完成导入,而go语言没有中间字节码这样的一个过程,所以引入第三方依赖的方式都是通过源码,随着人们对于方案的不断探索,对于go语言的方式管理也别有了如下两种主流方案:

  1. go get引入
  2. go vendor本地缓存

而本文将结合笔者近期针对性的魔改Nightingale底层的es客户端的经历来演示一下go语言中包管理,希望对你有帮助。

我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili ,也欢迎您了解我的开源项目 mini-redis:github.com/shark-ctrl/...

为方便与读者交流,现已创建读者群。关注下方公众号获取我的联系方式,添加时备注加群即可加入。

详解go modules的使用

项目初始化

我们通过goland创建一个名为awesomeProject项目,默认情况下goland为默认为我们生成一个go.mod文件,其内容标明:

  1. 项目名称即awesomeProject
  2. golang的版本号1.23
arduino 复制代码
module awesomeProject


go 1.23

此时,笔者项目的目录结构如下图:

基于go get演示导入elastic

因为Nightingale这个监控工具底层的es客户端不兼容es9,所以经过笔者调试发现其底层query表达式不正确,遂打算引入这个已被废弃的客户端调试一探究竟,按照go语言主流的包管理办法,通用管理步骤为:

  1. 项目上传到git
  2. 针对该项目打好tag标签
  3. 通过go get指令获取指定tag的依赖包

例如笔者想引入https://github.com/olivere/elastic这个第三方es客户端管理包,通过查看其go.mod对应模块名为:

arduino 复制代码
module github.com/olivere/elastic/v7

查看其依赖包对应最新版本为7.0.32

对应的我们就可以忽略前两步骤,直接在本地项目中呼出终端执行go get 模块名@版本号对应笔者的请求就是:

kotlin 复制代码
go get github.com/olivere/elastic/v7@v7.0.32

随后我们就可以愉快的使用这个模块包了:

此时我们就可以正常的引用和管理这个模块了,相比于java,因为go语言模块的引入都是引入源代码,所以我们完全可以直接通过IDE修改源码:

基于go vendor本地化三方依赖库

当然上述方案仅仅支持允许联网的情况,对于封网开发的读者可以通过go mod vendor将这个依赖直接缓存到本地进行调测开发:

基于魔改Nightingale底层es客户端源码演示go语言三方包管理

魔改三方包通用步骤

有了上述的基本概念,我们就来演示一个如果魔改已放弃维护的开源项目的通用套路,大体流程也很上述go get差不多,即基于github维度进行版本管理以及go get引入,只不过要修改第三方项目的源码,我们需要首先将项目fork到我们的仓库,以笔者本地修改的elastic为例,对应的执行步骤为:

  1. 将停止维护的elastic客户端fork到个人仓库
  2. clone本地
  3. 修改代码,并打tag(如果为了省事也可以用最新版,无需指明tag,笔者后文会介绍)提交到个人仓库
  4. 其他项目通过go get引入源项目地址并通过replace指向我们的项目

案例说明

基于这个实践结合笔者近期接触到的一个这里日志告警工具Nightingale,笔者在接入es9数据源时发现,查询时返回了es服务端语法错误:

经过笔者的调测Nightingale底层的es客户端发现,其底层elastic生成的范围查询时间采用了from、to语法,最新版的es9并不支持这种格式,需改为gte和lte:

魔改适配步骤详解

所以为了做到es9数据源适配,笔者就需要按照上述步骤的说法:

  1. fork已经不再维护的elastic
  2. 修改范围子查询源码
  3. 提交个人仓库
  4. Nightingale源码使用replace将es客户端改为自己魔改后的版本

针对fork和魔改操作笔者就不多做演示,这里笔者直接给出修改后的代码:

当然笔者这里为了省事直接通过go get module name@branch获取最新版本,以笔者为例对应的指令为go get github.com/shark-ctrl/elastic/v7@release-branch.v7

最终输出结果如下:

bash 复制代码
go: downloading github.com/shark-ctrl/elastic/v7 v7.0.0-20251112171420-808d8bfca650
go: added github.com/shark-ctrl/elastic/v7 v7.0.0-20251112171420-808d8bfca650

后续使用使用到魔改的项目直接采用replace修改引用的指向:

可以看到对应的es客户端就用到了笔者的魔改后的版本:

对应的es9的数据源查询也是可以了:

小结

相比于java源码的改造,go语言的特性使得采用go get指令和replace魔改开源工具更加从容且直观,本文这次针对Nightingale的数据源适配本质就是利用了go get对于三方工具的统一维护结合fork修改和Go mod replace完成底层数据源的适配。

需要补充说明一件事,就在笔者完成这个数据源适配且准备在项目组调测时,Nightingale的作者似乎也在近期完成了这个适配,所以本次的魔改工作就当是对于读者一次学习的普及吧:

我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili ,也欢迎您了解我的开源项目 mini-redis:github.com/shark-ctrl/...

为方便与读者交流,现已创建读者群。关注下方公众号获取我的联系方式,添加时备注加群即可加入。

参考

github.com/elastic/go-... go mod 和 go vendor 使用与区别:zhuanlan.zhihu.com/p/374044583 Gomodvendor使用教程与依赖管理技巧:www.17golang.com/article/245...

深入理解 Go Modules 的 go.mod 与 go.sum :cloud.tencent.com/developer/a...

使用go module导入本地包:zhuanlan.zhihu.com/p/109828249

Golang实战:从零开始构建并发布自己的Go语言库到GitHub及Go Module管理:www.oryoy.com/news/golang...

Go mod replace 使用:segmentfault.com/a/119000004...

本文使用 markdown.com.cn 排版

相关推荐
回家路上绕了弯2 小时前
用户中心微服务设计指南:从功能到非功能的全维度落地
后端·微服务
Main121382 小时前
Java Duration 完全指南:高精度时间间隔处理的利器
后端
用户3459474113612 小时前
Android系统中HAL层开发实例
后端
undefined在掘金390412 小时前
第二节 Node.js 项目实践 - 使用 nvm 安装 Node.js
后端
小码编匠2 小时前
.NET 10 性能突破:持续优化才是质变关键
后端·c#·.net
Python私教2 小时前
Python可以爬取哪些公开金融数据
后端
SimonKing3 小时前
还在为HTML转PDF发愁?再介绍两款工具,为你保驾护航!
java·后端·程序员
创码小奇客3 小时前
Spring Boot依赖排坑指南:冲突、循环依赖全解析+实操方案
后端·面试·架构
Java天梯之路3 小时前
09 Java 异常处理
java·后端