写在文章开头
对于java开发而言,每一个项目完成之后都会打成一个jar包即中间层代码,所以可借由依赖包管理工具maven完成导入,而go语言没有中间字节码这样的一个过程,所以引入第三方依赖的方式都是通过源码,随着人们对于方案的不断探索,对于go语言的方式管理也别有了如下两种主流方案:
- go get引入
- go vendor本地缓存
而本文将结合笔者近期针对性的魔改Nightingale底层的es客户端的经历来演示一下go语言中包管理,希望对你有帮助。
我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili ,也欢迎您了解我的开源项目 mini-redis:github.com/shark-ctrl/...。
为方便与读者交流,现已创建读者群。关注下方公众号获取我的联系方式,添加时备注加群即可加入。
详解go modules的使用
项目初始化
我们通过goland创建一个名为awesomeProject项目,默认情况下goland为默认为我们生成一个go.mod文件,其内容标明:
- 项目名称即awesomeProject
golang的版本号1.23
arduino
module awesomeProject
go 1.23
此时,笔者项目的目录结构如下图:

基于go get演示导入elastic
因为Nightingale这个监控工具底层的es客户端不兼容es9,所以经过笔者调试发现其底层query表达式不正确,遂打算引入这个已被废弃的客户端调试一探究竟,按照go语言主流的包管理办法,通用管理步骤为:
- 项目上传到git
- 针对该项目打好tag标签
- 通过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为例,对应的执行步骤为:
- 将停止维护的elastic客户端fork到个人仓库
- clone本地
- 修改代码,并打tag(如果为了省事也可以用最新版,无需指明tag,笔者后文会介绍)提交到个人仓库
- 其他项目通过go get引入源项目地址并通过replace指向我们的项目

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

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

魔改适配步骤详解
所以为了做到es9数据源适配,笔者就需要按照上述步骤的说法:
- fork已经不再维护的elastic
- 修改范围子查询源码
- 提交个人仓库
- 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 排版