问题描述
我的项目有很多包,它们相互导入并导入外部包。当我对我的一个低杠杆包进行更改,然后将其推送到 git 时,它很好并且可以在该部分工作。当我将它用于另一个运行良好的项目时,我现在得到了这个错误:
module declares its path as: github.com/xdg-go/scram
but was required as: github.com/xdg/scram
我的代码都没有直接使用其中任何一个。看起来它自动更新了一些较低的外部包并破坏了用于旧导入的东西。
解决方法
github.com/xdg/scram 上的 go.mod
文件将自身声明为 github.com/xdg-go/scram
:
module github.com/xdg-go/scram
go 1.11
require (
github.com/xdg-go/stringprep v1.0.2
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
)
应该更新 go.mod
文件以反映正确的导入路径。
不幸的是,如果这个模块对你来说是一个间接依赖,最好的解决办法是更新你导入的任何直接导入它的项目。
如果这不是一个选项,此错误的解决方案是在本地克隆有问题的存储库并在您的 replace
文件中使用 go.mod
指令:
module mymodule
replace github.com/xdg/stringprep => ../strprep
go 1.16.2
require (
github.com/divjotarora/mgo v0.0.0-20190308170442-1d451d2a3149
)
其中 ../strprep
是本地机器中所需模块的代码所在的位置,相对于项目的 go.mod
文件。
当然,这样做的缺点是您必须在计划go get
模块的任何地方复制这种姑息性修复。
还要注意:
-
divjotarora/mgo
只是一个使用旧导入路径导入其中一个包的项目的随机示例。 - 我以
xdg/stringprep
为例,因为我找不到导入xdg/scram
的模块,但显然 it suffers 来自同一问题
此外,您可以使用:
-
go mod why <package>
找出为什么某个包被列为您项目的依赖项 -
go mod graph
显示完整的依赖关系图。输出采用<package> <requirement>
格式