cmd/go/internal/list: insufficient error tolerance on listing packages

izkcnapc  于 4个月前  发布在  Go
关注(0)|答案(7)|浏览(52)

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

$ go version
go version go1.20.3 darwin/amd64 (unrelated)

这个问题在最新版本中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
unrelated, preferred not to disclose

你做了什么?

我使用了vscode-go来浏览一个我没有权限访问其依赖项的仓库。该扩展无法加载工作区,抱怨说我没有访问相关仓库的权限,因此vscode甚至无法索引我已有的源代码。经过深入研究,我发现给出抱怨的命令是:
https://github.com/golang/vscode-go/blob/master/src/goPackages.ts#L60

go list -e -f '{{.Name}};{{.ImportPath}};{{.Dir}}' std all

你期望看到什么?

我期望它能容忍错误,就像通过传递-e参数告诉它的那样。-e标志改变了对错误包的处理,即找不到的包或格式错误的包。

你看到了什么?

相反,它试图下载缺失的包(由于权限错误),如果下载失败则失败。

当前的解决方法

对于任何陷入类似情况的人,也许你可以尝试go mod tidy -e,然后通过设置:

{
    "go.toolsEnvVars": {
        "GO111MODULE": "off"
    }
}

.vscode/settings.json中禁用go模块。modload包似乎与go包一起工作。

68bkxrlz

68bkxrlz1#

我对golang源代码不熟悉,但我怀疑是传递给load.PackagesAndErrorsAutoVCS标志引发了错误

// src/cmd/go/internal/list/list.go#L605-L612
pkgOpts := load.PackageOpts{
	IgnoreImports:      *listFind,
	ModResolveTests:    *listTest,
	AutoVCS:            true,
	SuppressBuildInfo:  !*listExport && !listJsonFields.needAny("Stale", "StaleReason"),
	SuppressEmbedFiles: !*listExport && !listJsonFields.needAny("EmbedFiles", "TestEmbedFiles", "XTestEmbedFiles"),
}
pkgs := load.PackagesAndErrors(ctx, pkgOpts, args)

fzsnzjdm

fzsnzjdm2#

我深入挖掘后发现,这不仅仅是关于AutoVCS的问题,而且:
当没有列出模块(没有-mod标志)时,如果启用了go modules(现在默认启用),go list不会告诉load.PackagesAndErrors执行modload.LoadPackages以允许错误,这在发生错误时会导致进程终止。
我认为modload.LoadPackages也在执行go mod tidy时使用。它还接受一个AllowError选项。

8oomwypt

8oomwypt3#

在通过重新编译带有正确传播到modloadlistE的go二进制文件解决了这个问题后,我注意到gopls有几次尝试调用go list而不调用-e:

go list -modfile=/var/folders/1b/jvpybz8s7lq9hb5llmfwy0_c0000gn/T/go.eb3c3e8094d54e5efda22499fbea51c5ebf8c8ed08419e55fbb934c47a48f885.3405178131.mod -mod=mod -f {{context.GOARCH}} {{context.Compiler}} -- unsafe
go list -mod=readonly -m -f {{.Path}} {{.Dir}} {{.GoMod}} {{.GoVersion}} {{range context.ReleaseTags}}{{if eq . "go1.14"}}{{.}}{{end}}{{end}}

由于仓库权限问题,它们都以代码1退出。
我是否也应该为gopls提交一个问题?

hs1ihplo

hs1ihplo4#

CC @bcmills, @matloob。

mspsb9vt

mspsb9vt5#

抱歉打扰,但你有没有深入研究/查看过这个?

fxnxkyjh

fxnxkyjh6#

这真的需要超过一个月的时间来调查吗?🤔至少取得一些进展会很好,请?

llycmphe

llycmphe7#

这个问题在待办事项中,并且Go是一个开源项目。如果你愿意帮助推动它,我很高兴能审查一个更改来修复它。

相关问题