GO (无法)同时引用同一个库的不同版本(未从代码角度解决)
GO (无法)同时引用同一个库的不同版本(未从代码角度解决)
背景
一个区块链项目需要用到 https://github.com/ethereum/go-ethereum (geth)这个库去对不同的链(eth, bnb 等)包括我们自己的链(随便取个称呼BF)进行扫块。项目中用的是 geth v1.14.6 后来调用智能合约查询我们自己的链(后面就用BF来称呼)上W代币的账户余额时,发现因为 BF 链没有更新的原因, 导致 geth v1.14.6 这个版本根本用不了,测试后发现只能使用 geth v1.12.2 这个版本。当我测试使用 geth v1.12.2 版本时,eth,bnb等链又无法正常扫块了,因为他们更新升级和 geth 是配套的。总之,到这里其实问题是出在 BF 链身上的,和我们项目是没关系的,就这个情况我心中抛出了一个问题:go项目可以同时引用同一个库的不同版本吗?
测试
go version = 1.22.4
经过在多方查找,很遗憾以下方法都不可行
明确不可行的方案
-
直接在依赖中引用两个版本,不可行
-
Go mod 嵌套引用不同版本的module, 最终会使用最新版本,不可行
├── go.mod
├── go.sum
├── lowVersion
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── main.go -
使用replace 不可行
replace (
github.com/ethereum/go-ethereum2 => github.com/ethereum/go-ethereum v1.12.2
)
require (
github.com/ethereum/go-ethereum2 v0
github.com/ethereum/go-ethereum v1.14.6
github.com/metachris/eth-go-bindings v0.5.0
)
通过测试不可行的方案
-
将 geth 代码库 fork 一份 然后当作新的包abc, 再引用 abc v1.12.2,包内部重复声明,不可行。
-
把 geth v1.12.2 要调用的方法包装一下,发布成一个新的包 abc, 再引用 abc, 同样不可行。
解决方式
明确go无法同时引用同一个库的不同版本,最后自己写jsonrpc 方法调用