Justin-刘清政的博客

06-go get golang.org/x 包失败

2020-04-01

一 问题背景

当我们使用 go getgo installgo mod 等命令时,会自动下载相应的包或依赖包。但由于众所周知的原因(科学上网),类似于 golang.org/x/... 的包会出现下载失败的情况。如下所示:

1
2
3
4
5
//go get下载包
go get -u golang.org/x/sys
//报错
go 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)

二 解决方案一(手动下载)

常见的 golang.org/x/... 包,一般在 GitHub 上都有官方的镜像仓库对应。比如 golang.org/x/text 对应 github.com/golang/text。所以,我们可以手动下载或 clone 对应的 GitHub 仓库到指定的目录下。

1
2
3
4
5
mkdir $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone git@github.com:golang/text.git
rm -rf text/.git
# 当如果需要指定版本的时候,该方法就无解了,因为 GitHub 上的镜像仓库多数都没有 tag

三 解决方案(二)设置代理

如果你自己或者花钱买了代理,那么可以设置对应的环境变量:

1
2
export http_proxy=http://proxyAddress:port
export https_proxy=http://proxyAddress:port

或者,直接用 all_proxy

1
export all_proxy=http://proxyAddress:port

四 解决方案(三)go mod replace

从 Go 1.11 版本开始,新增支持了 go modules 用于解决包依赖管理问题。该工具提供了 replace,就是为了解决包的别名问题,也能替我们解决 golang.org/x 无法下载的的问题。

go module 被集成到原生的 go mod 命令中,如果你的代码库在 $GOPATH 中,module 功能是默认不会开启的通过一个环境变量即可开启 export GO111MODULE=on

如下go.mod(通过repalce,替换)

1
2
3
4
5
6
7
8
9
module example.com/hello

require (
golang.org/x/text v0.3.0
)

replace (
golang.org/x/text => github.com/golang/text v0.3.0
)

五 终极解决方案(四)GOPROXY 环境变量

设置 —— GOPROXY

我们知道从 Go 1.11 版本开始,官方支持了 go module 包依赖管理工具。

其实还新增了 GOPROXY 环境变量。如果设置了该变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。

goproxy.io 这个开源项目帮我们实现好了我们想要的。该项目允许开发者一键构建自己的 GOPROXY 代理服务。同时,也提供了公用的代理服务 https://goproxy.io,我们只需设置该环境变量即可正常下载被墙的源码包了:

1
export GOPROXY=https://goproxy.io

不过,需要依赖于 go module 功能。可通过 export GO111MODULE=on 开启 MODULE。

如果项目不在 GOPATH 中,则无法使用 go get ...,但可以使用 go mod ... 相关命令。

也可以通过置空这个环境变量来关闭,export GOPROXY=

对于 Windows ,可以在 PowerShell 中设置:

1
$env:GOPROXY = "https://goproxy.io"

最后,使用 GOPROXY 这个环境变量的解决方式,前提是 Go version >= 1.11

同时,七牛也出了个国内代理 goproxy.cn 方便国内用户更快的访问不能访问的包

Tags: Go
使用支付宝打赏
使用微信打赏

点击上方按钮,请我喝杯咖啡!

扫描二维码,分享此文章