Golang模块问题:同一个包使用了两个不同的模块路径

Golang模块问题:同一个包使用了两个不同的模块路径

您使用的Go版本是什么(go version)?

$ go version go version go1.12.5 linux/amd64

此问题是否在最新版本中重现?

您做了什么?

go.mod:

replace (
bou.ke/monkey => github.com/bouk/monkey v1.0.0
go.uber.org/multierr => github.com/uber-go/multierr v1.1.0
go.uber.org/zap => github.com/uber-go/zap v1.9.1
golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190422183909-d864b10871cd
golang.org/x/lint => github.com/golang/lint v0.0.0-20190409202823-959b441ac422
golang.org/x/net => github.com/golang/net v0.0.0-20190420063019-afa5a82059c6
golang.org/x/sync => github.com/golang/sync v0.0.0-20190423024810-112230192c58
golang.org/x/sys => github.com/golang/sys v0.0.0-20190422165155-953cdadca894
golang.org/x/text => github.com/golang/text v0.3.0
golang.org/x/tools => github.com/golang/tools v0.0.0-20190422233926-fe54fb35175b
google.golang.org/appengine => github.com/golang/appengine v1.6.0
google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20190418145605-e7d98fc518a7
google.golang.org/grpc => github.com/grpc/grpc-go v1.20.1
gopkg.in/alecthomas/kingpin.v2 => github.com/alecthomas/kingpin v2.2.6+incompatible
gopkg.in/check.v1 => github.com/go-check/check v0.0.0-20180628173108-788fd7840127
gopkg.in/fsnotify.v1 => github.com/fsnotify/fsnotify v1.4.8-0.20190312181446-1485a34d5d57
gopkg.in/go-playground/assert.v1 => github.com/go-playground/assert v1.2.1
gopkg.in/go-playground/validator.v8 => github.com/go-playground/validator v8.18.2+incompatible
gopkg.in/ini.v1 => github.com/go-ini/ini v1.42.0
gopkg.in/tomb.v1 => github.com/go-tomb/tomb v0.0.0-20141024135613-dd632973f1e7
gopkg.in/yaml.v2 => github.com/go-yaml/yaml v0.0.0-20181115110504-51d6538a90f8
)

然后

$ vend
$ go build -mod=vendor
go: github.com/golang/appengine@v1.6.0 用于两个不同的模块路径(github.com/golang/appengine 和 google.golang.org/appengine)
go: github.com/go-ini/ini@v1.42.0 用于两个不同的模块路径(github.com/go-ini/ini 和 gopkg.in/ini.v1)

您期望看到什么?

编译成功

您实际看到了什么?

编译失败


更多关于Golang模块问题:同一个包使用了两个不同的模块路径的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang模块问题:同一个包使用了两个不同的模块路径的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个典型的Go模块替换冲突问题。当同一个包通过不同的模块路径被引用时,Go模块系统会报错。在你的go.mod文件中,replace指令导致了模块路径冲突。

问题出现在这些替换上:

  • google.golang.org/appengine 被替换为 github.com/golang/appengine
  • gopkg.in/ini.v1 被替换为 github.com/go-ini/ini

但其他依赖可能同时引用了这两个路径的同一个包,导致Go模块系统检测到同一个包有两个不同的模块路径。

解决方案是检查你的依赖树,找出哪些包同时依赖了这两个路径。你可以使用以下命令来诊断:

go mod graph | grep -E "(github.com/golang/appengine|google.golang.org/appengine)"
go mod graph | grep -E "(github.com/go-ini/ini|gopkg.in/ini.v1)"

或者使用go mod why来追踪依赖关系:

go mod why github.com/golang/appengine
go mod why google.golang.org/appengine
go mod why github.com/go-ini/ini  
go mod why gopkg.in/ini.v1

一个临时的解决方法是移除冲突的替换规则,或者确保所有依赖都使用统一的模块路径。例如,你可以尝试:

// 移除冲突的替换
// google.golang.org/appengine => github.com/golang/appengine v1.6.0
// gopkg.in/ini.v1 => github.com/go-ini/ini v1.42.0

或者更新到更新的Go版本(1.13+),因为模块系统在这些版本中有更好的冲突处理机制。你也可以尝试清理vendor目录并重新生成:

rm -rf vendor
go mod vendor
go build -mod=vendor

如果问题仍然存在,可能需要检查具体的依赖版本兼容性,或者考虑升级到不产生这种冲突的依赖版本。

回到顶部