【问题标题】:go.mod has post-v0 module path "git.example.com/owner/repo/v3" at revision ...?go.mod 在修订版中有 post-v0 模块路径“git.example.com/owner/repo/v3”...?
【发布时间】:2019-07-22 10:14:48
【问题描述】:

我的同事在将go.mod 更新为具有/v3 后缀(https://github.com/golang/go/wiki/Modules#releasing-modules-v2-or-higher)之前推送了标签v3.0.1。我已经更新了模块路径(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 keeps complaining that: go.mod has post-v0 module path

所以,我删除了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

d85c4f69ad17master 中的最新提交)

我注意到go.sum 中有v0.1.2v3.0.2

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=

【问题讨论】:

    标签: go go-modules


    【解决方案1】:

    请关注我的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
    

    【讨论】:

    • 谢谢!这终于把我从一大堆的挫折中解救了出来。 :D
    【解决方案2】:

    例如,您可以使用以下 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

    【讨论】:

    • 2 件事:1. 它不起作用(与上述相同的错误)。 2.即使它有效,也只是一个hack。如果我有 100 个依赖项目,我必须在发布新标签时全部更新?
    • @quanta 我更新答案。试试看
    • @quanta 最后一个例子是: 1. 删除 go.modgo.sum 2. go cache clean 3. go mod vendor 它在类似情况下对我有帮助
    • 为什么是go mod vendor?问题是当我运行go get -v ...@v3.0.2 时又发生了。
    【解决方案3】:

    从@quanta 扩展answer...

    你正在做:

    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.x.y 包是具有自己的 go.mod 的模块,那么当您使用 modules enabled 进行操作时,您几乎总是在引用 v3.x.y 模块时包含 /v3,包括:

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

    一种思考方式是,模块的名称现在实际上是git.example.com/owner/repo/v3,其中它的名称包括结尾的/v3

    如果您是vN 模块的使用者,并且需要更新您的.go 文件中的导入路径以包含vN,那么 github.com/marwan-at-work/mod 是社区中常用的工具,可以自动在所有需要的位置添加/vN。另外,如果您是 v2+ 模块的模块作者,它还会自动将 /vN 放置在所有必需的位置。

    来自 Go 模块 wiki 的 "Semantic Import Versioning" 部分:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-02-02
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 2021-03-01
        • 1970-01-01
        相关资源
        最近更新 更多