如何停止在我的项目之外自动导入导入的项目?

How do I stop the auto importing of imported item in go outside of my project?

我的项目有很多相互导入和导入外部包的包。当我对我的一个低杠杆包进行更改,然后将其推送到 git 时,它很好并且可以在该部分中工作。当我将它用于另一个运行良好的项目时,我现在得到了这个错误:

module declares its path as: github.com/xdg-go/scram
    but was required as: github.com/xdg/scram

None 我的代码直接使用其中任何一个。看起来它自动更新了一些较低的外部包并破坏了用于然后旧导入的东西。

如何找出导入错误名称的包或停止所有自动更新?

位于 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 文件以反映正确的导入路径。

不幸的是,如果这个模块对你来说是一个间接依赖项,最好的解决方法是更新你导入的任何直接导入它的项目。

当这不是一个选项时,此错误的解决方案是在本地克隆有问题的存储库并在 go.mod 文件中使用 replace 指令:

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>