go get
、go install
、go mod
等命令时,会自动下载相应的包或依赖包。但由于众所周知的原因,类似于 golang.org/x/...
的包会出现下载失败的情况。如下所示:$ go get -u golang.org/x/sysgo get golang.org/x/sys: unrecognized import path "golang.org/x/sys" (https fetch: Get https://golang.org/x/sys?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
解决方式
那我们该如何解决问题呢?毕竟还要制造 bug 的嘛~
手动下载
golang.org/x/...golang.org/x/textgithub.com/golang/text
mkdir $GOPATH/src/golang.org/xcd $GOPATH/src/golang.org/xgit clone git@github.com:golang/text.gitrm -rf text/.git
当如果需要指定版本的时候,该方法就无解了,因为 GitHub 上的镜像仓库多数都没有 tag。并且,手动嘛,程序员怎么能干呢,尤其是依赖的依赖,太多了。
设置代理
如果你有代理,那么可以设置对应的环境变量:
export http_proxy=http://proxyAddress:portexport https_proxy=http://proxyAddress:port
all_proxy
export all_proxy=http://proxyAddress:port
go mod replace
go modulesreplacegolang.org/x
go modulego mod$GOPATHmoduleexport GO111MODULE=on
以下为参考示例:
module example.com/hellorequire ( golang.org/x/text v0.3.0)replace ( golang.org/x/text => github.com/golang/text v0.3.0)
类似的还有 glide、gopm 等这类第三方包管理工具,都不同方式的解决方案提供给我们。
GOPROXY 环境变量
终于到了本文的终极大杀器 —— GOPROXY。
Go 1.11go module
GOPROXY
GOPROXYhttps://goproxy.io
export GOPROXY=https://goproxy.io
go moduleexport GO111MODULE=on
GOPATHgo get ...go mod ...
export GOPROXY=
PowerShell
$env:GOPROXY = "https://goproxy.io"
GOPROXY
最后的最后,七牛也出了个国内代理 goproxy.cn 方便国内用户更快的访问不能访问的包,真是良心。