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 方法调用

posted @ 2024-07-08 14:48  等你下课啊  阅读(91)  评论(0)    收藏  举报