4

v3.0.1我的同事在更新之前推送了一个标签go.mod以具有/v3后缀(https://github.com/golang/go/wiki/Modules#releasing-modules-v2-or-higher)。我已经更新了模块路径 ( go.mod) 和所有导入路径 ( *.go) 来修复它,标记为v3.0.2.

现在的问题是:

go get -v git.example.com/owner/repo@v3.0.2
go: finding git.example.com/owner/repo v3.0.2
go: git.example.com/owner/repo@v0.0.0-20190722053407-d85c4f69ad17: go.mod has post-v0 module path "git.example.com/owner/repo/v3" at revision 
d85c4f69ad17

发现这个:go build 一直在抱怨:go.mod 有 post-v0 模块路径

所以,我删除了两个标签v3.0.0v3.0.1将它指向最新的提交,重新推送,但问题仍然存在。

我注意到go.mod仍然将旧版本称为间接依赖:

require (
    git.example.com/owner.repo v0.1.2 // indirect

即使我将其更改为/v3 v3.0.2它也会v0.1.12自动恢复。

为什么?

我错过了什么?


2019 年 7 月 23 日星期二 05:54:56 +07

rm go.*
go mod init git.example.com/dependent/project
go mod tidy

并且go.mod现在正确更新:

require (
-       git.example.com/owner/repo v0.1.2
+       git.example.com/owner/repo/v3 v3.0.2

go get -v git.example.com/owner/repo@v3.0.2仍然返回错误:

go: finding git.example.com/owner/repo v3.0.2
go: git.example.com/owner/repo@v0.0.0-20190722053407-d85c4f69ad17: go.mod has post-v0 module path "git.example.com/owner/repo/v3" at revision 
d85c4f69ad17

d85c4f69ad17是最新的提交master

我注意到两者都有v0.1.2和:v3.0.2go.sum

git.example.com/owner/repo v0.1.2 h1:mCGJEmyrFDTCGkRfUIORpqdrNkSONQ6K+AcTNgxqveY=
git.example.com/owner/repo v0.1.2/go.mod h1:FfUKnyPrARCtAXQZ3BQVJI7h2eJ0UpQBMLg4bNs4Kdc=
git.example.com/owner/repo/v3 v3.0.2 h1:mJtDKLeiP8vMRSZo08i/k/KDbIoZTlKW2aWu7DUBvMM=
git.example.com/owner/repo/v3 v3.0.2/go.mod h1:64LE0ts0Lk9InIQyhPYGmnxs6LZIl6H4Iorl1EXfqxo=
4

4 回答 4

4

请注意我的go get命令:

go get -v git.example.com/owner/repo@v3.0.2

它应该是:

go get -v git.example.com/owner/repo/v3@v3.0.2
于 2019-07-23T08:07:07.533 回答
0

例如,您可以用这个 hack 替换存储库:https ://github.com/golang/go/wiki/Modules

require {
...
}

replace git.example.com/owner.repo v0.1.2 => git.example.com/owner.repo v3.0.2

或者您可以go get在您想要的提交哈希处使用:

go get git.example.com/owner.repo@af044c0995fe

go get将正确更新依赖文件(go.mod,go.sum)。

更多信息:https ://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies

或者对于最后一个例子,你应该清理缓存

  1. 删除go.modgo.sum
  2. go cache clean
  3. go mod vendor
于 2019-07-22T11:17:28.350 回答
0

扩展来自@quanta的答案...

你正在做:

go get -v git.example.com/owner/repo@v3.0.2

因为它是一个 v3 模块,所以该go get命令应该/v3在 : 之前包含一个@

go get -v git.example.com/owner/repo/v3@v3.0.2

一旦 v3.xy 包是具有自己的 go.mod 的模块,那么当您使用启用的模块进行操作时,您几乎总是/v3在引用 v3.xy 模块时包含 ,包括:

  • go get命令行上的参数
  • .go消费者代码中的导入语句
  • require消费者 go.mod 中的语句
  • replaceexclude消费者 go.mod 中的声明
  • modulev3 模块的 go.mod 文件的行
  • v3 模块内代码中的内部导入语句.go导入 v3 模块中的其他包
  • 等等

考虑它的一种方法是模块的名称现在是有效git.example.com/owner/repo/v3的,它的名称包括尾随的/v3.

如果您是模块的使用者,并且 vN需要更新文件中的导入路径.go包含斑点。另外,如果您是 v2+ 模块的模块作者,它还会自动放置所有必需的位置。vN/vN/vN

从 Go modules wiki 的“Semantic Import Versioning”部分:

如果模块是 v2 或更高版本,则模块的主要版本必须作为 /vN 包含在 go.mod 文件中使用的模块路径(例如,module github.com/my/mod/v2require github.com/my/mod/v2 v2.0.0和包导入路径(例如,import "github.com/my/mod/v2/mypkg")的末尾.

于 2019-08-03T23:00:52.080 回答
0

我可能有一个类似的问题,我更新了一个模块以使用 /v2 导入路径,但是去获取模块总是返回一个关于无效 go.mod 的错误

解决方案是go get -u github.com/<me>/<pkg>/v2

于 2019-10-23T07:10:20.330 回答