如何更改 Go 模块路径?

How to change Go modules path?

我得到了一个 github 存储库 github。com/user/somerepo

我通过 go mod init **github.com/user/somerepo**

初始化它

我需要更改此依赖项并使其指向另一个 github 存储库。比方说:github.com/user/a-different-repo

有没有go命令可以更新所有文件中的所有导入语句?

go mod edit -replace 是你的朋友。

来自文档 (Source) :

The -replace=old[@v]=new[@v] flag adds a replacement of the given module path and version pair. If the @v in old@v is omitted, a replacement without a version on the left side is added,

这是重要的部分:

which applies to all versions of the old module path. If the @v in new@v is omitted, the new path should be a local module root directory, not a module path. Note that -replace overrides any redundant replacements for old[@v], so omitting @v will drop existing replacements for specific versions.

这里是负责替换的AddReplace func

现在要实现它,您的每个存储库都必须映射到您的 GOPATH。 关于 GOPATH 的一点回忆:

当你想要一个存储库成为一个 "go gettable" 包时,你应该将这个存储库映射到你的 GOPATH。

As explained here 当您执行 go get 时,它会首先在您的 $GOPATH 中查找并获取最新版本的包(或特定版本,如果您在go.mod 文件)

然后您可以通过执行此命令来实现您的编辑:

go mod edit -replace github.com/UserA/foo@v0.1=github.com/UserA/bar@v0.1

另一种方法(也许是更好的方法)是在 go.mod 文件中执行此操作,如下所示:

  module foo.bar                        

  replace github.com/UserA/foo => github.com/UserA/bar

  require (   
  github.com/UserA/foo v0.0.1
 )   

当然,这只有在每个存储库都映射到您的 GOPATH 时才有效。

另请参阅此处以获得进一步说明:when-should-i-use-the-replace-directive

go mod edit -module github.com/user/a-different-repo