用户可以将 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
2条答案
按热度按时间iklwldmw1#
我很可能在对话中落后了,但对我来说,
GOPROXY=off
简单地说“不要使用代理”。这可能/应该意味着“直接去”,而不是“去本地”?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时提高用户体验。