`cmd/go: 不兼容的模块路径检查不适用于 gopkg.in/yaml.v2`

p5fdfcr1  于 4个月前  发布在  Go
关注(0)|答案(1)|浏览(40)

你正在使用哪个版本的Go(go version)?

$ go version
go version
go version go1.20.1 darwin/amd64

你做了什么?

-- go.mod --
module w

go 1.20

require gopkg.in/yaml.v2 v2.4.0

replace gopkg.in/yaml.v2 => gopkg.in/yaml.v3 v3.0.0

-- main.go --
package main

import "gopkg.in/yaml.v2"

func main() {
        var t struct{ A string }
        _, _ = yaml.Marshal(&t)
}

运行 go build
注意:go.mod不整洁。

你想看到什么?

与模块路径不匹配的错误(gopkg.in/yaml.v2 vs gopkg.in/yaml.v3)

你看到了什么?

没有错误。
go list可以看到替换。

$ go list -f '{{.Module}}' gopkg.in/yaml.v2
gopkg.in/yaml.v2 v2.4.0 => gopkg.in/yaml.v3 v3.0.0

go mod tidy 将gopkg.in/yaml.v3添加到间接需要的组中。
go build 在go.sum中有v2的条目时是正常的。

module w

go 1.20

require gopkg.in/yaml.v2 v2.4.0

require gopkg.in/yaml.v3 v3.0.1 // indirect

replace gopkg.in/yaml.v2 => gopkg.in/yaml.v3 v3.0.0

另一方面,

--- go.mod ---
module e

go 1.20

require (
        github.com/go-logr/logr v1.2.0 // indirect
        k8s.io/klog v1.0.0
)
--- main.go ---
package main

import "k8s.io/klog/v2"

func main() {
        _ = klog.Info
}
--- go.sum ---
github.com/go-logr/logr v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
k8s.io/klog/v2 v2.90.0 h1:VkTxIV/FjRXn1fgNNcKGM8cfmL1Z33ZjXRTVxKCoF5M=
k8s.io/klog/v2 v2.90.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=

go build 返回错误(然而,没有明确讨论这个路径问题)

go build
main.go:3:8: no required module provides package k8s.io/klog/v2; to add it:
        go get k8s.io/klog/v2

go mod tidy 成功地将go.mod更新为以下内容而没有错误。

module e

go 1.20

require k8s.io/klog/v2 v2.90.0

require github.com/go-logr/logr v1.2.0 // indirect

replace k8s.io/klog => k8s.io/klog/v2 v2.90.0

在那之后 go build 成功了(我不知道为什么)。
但是 go list -f '{{.Module}}' k8s.io/klog 报告了错误

$ go list -f '{{.Module}}' k8s.io/klog
module k8s.io/klog provides package k8s.io/klog and is replaced but not required; to add it:
        go get k8s.io/klog
$ go get k8s.io/klog
go: k8s.io/klog/v2@v2.90.0 used for two different module paths (k8s.io/klog and k8s.io/klog/v2)

相关问题