x/tools/imports: package in v2 module listed in go.mod is resolved to non-listed v1

i1icjdpr  于 2个月前  发布在  Go
关注(0)|答案(4)|浏览(36)

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

$ go version
1.20
$ go version -m $(which goimports)
/home/dolmen/go/bin/goimports: go1.20
	path	golang.org/x/tools/cmd/goimports
	mod	golang.org/x/tools	v0.5.0	h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4=
	dep	golang.org/x/mod	v0.7.0	h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
	dep	golang.org/x/sys	v0.4.0	h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
	build	-buildmode=exe
	build	-compiler=gc
	build	CGO_ENABLED=1
	build	CGO_CFLAGS=
	build	CGO_CPPFLAGS=
	build	CGO_CXXFLAGS=
	build	CGO_LDFLAGS=
	build	GOARCH=amd64
	build	GOOS=darwin
	build	GOAMD64=v3

这个问题在最新版本中是否可以复现?

是的
问题可以在仓库的最新提交中复现:

$ go install golang.org/x/tools/cmd/goimports@master
go: downloading golang.org/x/tools v0.5.1-0.20230207145906-edddc5fc3223

你做了什么?

  1. 在不包含不完整导入的情况下创建 main.goxurls 符号没有链接到任何声明的导入。
  2. 创建 go.mod 以列出依赖项。有一个模块的主要版本为2: mvdan.cc/xurls/v2@v2.4.0
  3. 运行 goimports 以修复导入
$ cat main.go
package main

// Some imports are missing.
// I expect goimports to resolve them using modules listed in go.mod.
import "os"

func main() {
	os.Args[1] = os.Args[0]
	os.Args = os.Args[1:]
//line :1
	fmt.Println(xurls.Relaxed().FindAllString(os.Args[1], -1))
}
$ cat go.mod
module demo

go 1.20

require mvdan.cc/xurls/v2 v2.4.0
$ cat go.sum
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
mvdan.cc/xurls/v2 v2.4.0 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc=
mvdan.cc/xurls/v2 v2.4.0/go.mod h1:+GEjq9uNjqs8LQfM9nVnM8rff0OQ5Iash5rzX+N1CSg=
$ go install golang.org/x/tools/cmd/goimports@master
go: downloading golang.org/x/tools v0.5.1-0.20230207145906-edddc5fc3223
$ goimports main.go
package main

// Some imports are missing.
// I expect goimports to resolve them using modules listed in go.mod.
import (
	"fmt"
	"os"

	"mvdan.cc/xurls"
)

func main() {
	os.Args[1] = os.Args[0]
	os.Args = os.Args[1:]
//line :1
	fmt.Println(xurls.Relaxed().FindAllString(os.Args[1], -1))
}

你期望看到什么?

main.go 中修复了导入。特别是导入了 mvdan.cc/xurls/v2

import (
	"fmt"
	"os"

	"mvdan.cc/xurls/v2"
)

你看到了什么?

我得到了一个导入 mvdan.cc/xurls(它是v1,并且是不同的API),而不是 mvdan.cc/xurls/v2
作为结果,由 goimports 修改的代码无法编译。

svmlkihl

svmlkihl2#

我同意#41800是同一个问题。至少在这里,我提供了一个更容易重现的流程。

szqfcxe2

szqfcxe23#

感谢您提供的简单示例。即使模块缓存和go.mod中都使用了v2版本,imports仍然获取到了错误的版本。

yrefmtwq

yrefmtwq4#

https://go.dev/cl/582557提到了这个问题:internal/imports: recognize major versions and use go.mod

相关问题