我有一个 github仓库 github.com/user/somerepo。
我通过这样做来初始化它go mod init **github.com/user/somerepo**
我需要更改此依赖项并使其指向另一个 github 存储库。比方说:github.com/user/a-different-repo。
是否有任何 go 命令可以更新所有文件中的所有导入语句?
我有一个 github仓库 github.com/user/somerepo。
我通过这样做来初始化它go mod init **github.com/user/somerepo**
我需要更改此依赖项并使其指向另一个 github 存储库。比方说:github.com/user/a-different-repo。
是否有任何 go 命令可以更新所有文件中的所有导入语句?
这go mod edit -replace是你的朋友。
从文档(来源):
-replace=old[@v]=new[@v] 标志添加了给定模块路径和版本对的替换。如果 old@v 中的 @v 被省略,则添加左侧没有版本的替换,
这是重要的部分:
这适用于旧模块路径的所有版本。如果省略 new@v 中的 @v,则新路径应该是本地模块根目录,而不是模块路径。请注意,-replace 会覆盖 old[@v] 的任何冗余替换,因此省略 @v 将删除特定版本的现有替换。
这是负责替换的AddReplace 函数。
现在要实现它,您的每个存储库都必须映射到您的 GOPATH。对 GOPATH 的一点回忆:
当您希望存储库成为“go gettable”包时,您应该将此存储库映射到您的 GOPATH。
正如您在此处解释的那样go get,它将首先在您$GOPATH的 an 中查找最新版本的软件包(或者如果您在 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