如何修复解析 go.mod 模块将其路径声明为“ x”但需要为“ y”的问题

我的工作是一个去项目,这是一个依赖于 original-project。现在我想通过修改 original-project来改变这个项目中的行为。因此,我将 github.com/y/original-project克隆到 github.com/x/my-version,并将 github.com/y/original-project的所有发生位置替换为 github.com/x/my-version(包括在 mod.go中)。

但我一直得到这个错误:

go: github.com/x/my-version@v0.5.2: parsing go.mod:
module declares its path as: github.com/y/original-project
but was required as: github.com/x/my-version

即使我运行 go get -u -v -f allgithub.com/x/my-version

我能做错什么?

61106 次浏览

我认为问题来自于这样一个事实,即你的 original-project克隆版本的 go.mod仍然说 module github.com/y/original-project。你应该使用 go.mod replace指令。就是为你这种案子准备的。

replace github.com/y/original-project => /path/to/x/my-version

我发现解决这个问题的唯一方法是尝试找到所有出现的旧的(或者新的,也许)依赖项并手动删除它

find ~/go | grep original-project
rm -rf ~/go/pkg/mod/cache/download/github.com/y/original-project
rm -rf ~/go/pkg/mod/cache/download/github.com/x/my-version
rm -rf ~/go/pkg/mod/github.com/y/original-project*
rm -rf ~/go/pkg/mod/github.com/x/my-version*
rm -rf ~/go/pkg/mod/cache/download/sumdb/sum.golang.org/lookup/github.com/y/original-project*
rm -rf ~/go/pkg/mod/cache/download/sumdb/sum.golang.org/lookup/github.com/x/my-version*

然后又是 go get

我目前正在开发一个 Go 软件包,遇到了这个问题。我最初在 go.mod文件的顶部使用了 module <package-name>语法。由于模块下载不正确,我将语法切换为 module github.com/<user>/<package-name>。不幸的是,即使我手动删除了依赖项,我的系统仍然停留在旧的下载缓存上。

为了解决这个问题,我在 GitHub 上为该项目创建了一个新的发布标记(v0.0.1-beta) ,现在它可以很好地下载。go get存储带有 version 标记的模块,因此绕过了这个问题。

诀窍是更新 go mod缓存。

因此,在 go.mod(即 github.com/X/Z => github.com/Y/Z)中进行所需的更改之后,您需要下拉更新本地 go mod缓存的最新版本。

go get github.com/Y/Z@fd02212

然后错误消息就会出现。

使用 go mod edit -replace命令。

例子一:

go mod edit -replace github.com/y/original-project=github.com/x/my-version@v0.5.2

例二:

go mod edit -replace github.com/codahale/hdrhistogram=github.com/HdrHistogram/hdrhistogram-go@v0.9.0

发信人: https://github.com/HdrHistogram/hdrhistogram-go

我也有类似的问题。最后,我删除了试图导入的项目中的 go.mod 文件,并再次运行 go mod init ...。修好了。

另外,在导入时运行 go clean -modcache

然后尝试 go get ...您的包。

删除 go.mod 和 go.sum

go clean -modcache && go init

这招对我很管用

这对我很有效:

  1. 从目录中删除 go.mod文件
  2. 运行 go clean -modcache
  3. 运行 go get

在我的例子中,我编辑了我的 go.mod并补充道:

require github.com/anyuser/anyrepo **latest**

然后,在终端机上输入:

go mod download

我有同样的问题与软件包的名称,在搜索了很多我发现 golang 缓存来自 golang 代理服务器“不知道如何”,但缓存在我的 Mac 清理运行 go clean -modcache,但当我使用 go mod downloadgo mod tidy总是选择错误的版本软件包。

在将 GOPROXY变量重写为 GOPROXY="direct"之后,一切都开始工作。

go env -w GOPROXY="direct"

如果它开始工作,您可以恢复您的 GOPROXY 设置,使用直接将显示模块下载。

如果使用 Goland,请确保在自动完成间接模块的设置中启用了 Go Module Integration。

enter image description here

对我有用的是

go.mod中改变 module github.com/otherperson/therepo-> module github.com/me/therepo

然后逃跑

go get github.com/myfork@latest_commit_hash

我这么做了,而且成功了。

go get -u "github.com/org/package@latest"

实际上我也有同样的错误,我从 Github 导入了一个私有的回购包,问题是包的名称(go.mod中的第一行)与回购网址的名称不同。所以我们需要确保它们是一样的。

错误:

  • Github repo url: github.com/Mansouri147/private-repo
  • 一线 go.mod: module mansouri147/different-name

成功:

  • Github repo url: github.com/Mansouri147/private-repo
  • 一线 go.mod: module github.com/Mansouri147/private-repo

就我而言,我不想仅仅局限于本地化,而是要确保它对每个人都有效。

在更改 go.mod 中的值之后(最好删除 go.mod 和 go.sum 文件,然后运行

go mod init github.com/organization/new-package-name
go mod tidy
go get github.com/organization/new-package-name

以上并没有真正解决我的问题,也没有 go clean -modcache

相反,对我起作用的是删除,然后在新分支的项目上重新创建标记

然后创建一个新标记。

git tag v1.0.0 -m "new version"
git push origin v1.0.0

在这之后,你可以直接通过

go get github.com/organization/new-package-name@latest

或者

go get github.com/organization/new-package-name@v1.0.0