当 GOPROXY=off 时,cmd/go 应该列出缓存的版本列表吗?

amrnrhlw  于 5个月前  发布在  Go
关注(0)|答案(2)|浏览(57)

用户可以将 GOPROXY=off 设置为禁用模块获取。然而,当设置了这个选项后,他们仍然可以解析已经存在于本地缓存中的版本。
但是,要弄清楚这些版本实际上是什么可能会很困难:如果代理中没有该模块,go list -versions -m $MODULE 会产生无助的错误输出(#32335),而如果该模块确实存在,则会截断输出:

example.com$ gotip version
go version devel +220552f6 Thu May 30 17:59:57 2019 +0000 linux/amd64

example.com$ gotip mod init example.com
go: creating new go.mod: module example.com

example.com$ GOPROXY='' gotip list -versions -m rsc.io/quote
go: finding rsc.io/quote v1.5.2
rsc.io/quote v1.0.0 v1.1.0 v1.2.0 v1.2.1 v1.3.0 v1.4.0 v1.5.0 v1.5.1 v1.5.2 v1.5.3-pre1

example.com$ GOPROXY=off gotip list -versions -m rsc.io/quote
go list -m rsc.io/quote: module "rsc.io/quote" is not a known dependency

example.com$ GOPROXY='' gotip get rsc.io/quote@latest
go: finding rsc.io/sampler v1.3.0
go: finding golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: downloading rsc.io/quote v1.5.2
go: extracting rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: extracting rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: extracting golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c

example.com$ GOPROXY=off gotip list -versions -m rsc.io/quote
rsc.io/quote

example.com$

解决方法是在运行 go list 之前设置 GOPROXY="file://$GOPATH/pkg/mod/cache/download" :

example.com$ GOPROXY="file://$GOPATH/pkg/mod/cache/download" gotip list -versions -m rsc.io/quote
rsc.io/quote v1.5.2

example.com$

不幸的是,这实际上是无法发现的(尽管如此)。
相反,我建议当 GOPROXY 被设置为 off 时,go list -versions 应该列出可用的版本,而无需咨询代理,就像用户设置了 GOPROXY="file://$GOPATH/pkg/mod/cache/download" 一样。
在这种情况下,我认为我们无法提供其他合理的行为,这将使一个在上下文中毫无用处的命令变得有用。
CC @jayconrod@hyangah@thepudds@myitcv@rsc

iklwldmw

iklwldmw1#

我很可能在对话中落后了,但对我来说,GOPROXY=off 简单地说“不要使用代理”。这可能/应该意味着“直接去”,而不是“去本地”?

pu82cl6c

pu82cl6c2#

感谢@bcmills提出这个问题。

关于这个功能请求的更多背景信息:我发现在没有网络访问的情况下使用Go变得更难,并且在模块模式下比旧的GOPATH模式需要更多的学习。在模块模式下,我能做的最好的事情是确保它们在模块缓存中或者Go可以识别为文件代理的地方,但这仍然不够,因为许多Go命令在我明确设置GOPROXY=file://$GOPATH/pkg/mod/cache/download(我永远不会记住)或我的工作区中的go.mod文件已经完全指定了模块及其版本之前将无法工作。

我考虑过的另一个选项是拥有另一个GOPROXY模式(也许GOPROXY=local,GOPROXY=file://$GOPATH/pkg/mod/cache/download的别名)。与GOPROXY=off不同,我希望这个模式允许go get在模块缓存中获取最新的模块/版本,即使模块、版本尚未在go.mod中指定。但是鉴于GOPROXY=off已经被@myitcv指出令人困惑,我不确定引入另一个模式是个好主意。

无论Go团队在这个特定问题上做出什么决定,我都希望在使用Go时提高用户体验。

相关问题