因为一些客观缘由的存在,咱们开发 Golang 项目的过程总会碰到没法下载某些依赖包的问题。这不是一个小问题,由于你的工做会被打断,即使你使用各类神通解决了问题,极可能这时你的线程已经切换到其余的事情上了(痛恨思路被打断!)。因此最好是一开始咱们就重视这个问题,并一劳永逸的解决它。git
当咱们使用 go get、go install、go mod 等命令时,相似于 golang.org/x/... 的包会是没法下载的。好比经过下面的命令下载 sys 包:github
$ go get -u golang.org/x/sys
下载确定会失败:golang
若是你有本身的代理服务器,那就很容易了,这也是一劳永逸的方法。直接设置环境变量 http_proxy 和 https_proxy 就好了:服务器
export http_proxy=http://proxyAddress:port export https_proxy=http://proxyAddress:port
好比笔者在局域网中共享了代理 192.168.21.1:1080:工具
$ export http_proxy=http://192.168.21.1:1080 $ export https_proxy=http://192.168.21.1:1080
而后执行下面的命令后就可以下载了:ui
$ go get -u golang.org/x/sys
若是一时找不到合适的代理,还能够临时经过手动的方式下载包。咱们常见的 golang.org/x/... 包,通常在 GitHub 上都有官方的镜像仓库对应。好比 zieckey/golang.org 就是做为 golang.org/x 的镜像库存在的。咱们能够手动下载或 clone 对应的 GitHub 仓库到指定的目录下,好比从 zieckey/golang.org 下载 x 目录下的全部包。或者是每次只下载单个的库,下面的示例演示如何下载 text 库:spa
$ mkdir $GOPATH/src/golang.org/x $ cd $GOPATH/src/golang.org/x $ git clone git@github.com:golang/text.git
当若是须要指定版本的时候,该方法就无解了,由于 GitHub 上的镜像仓库多数都没有 tag。线程
从 Go 1.11 版本开始,新增支持了 go modules 用于解决包依赖管理问题。该工具提供了 replace,就是为了解决包的别名问题,也能替咱们解决 golang.org/x 没法下载的的问题。代理
go module 被集成到原生的 go mod 命令中,可是若是你的代码库在 $GOPATH 中,module 功能是默认不会开启的,想要开启也很是简单,经过一个环境变量便可开启 export GO111MODULE=on。好比下面的示例,在go.mod中指定下面的代码:code
module example.com/demo require ( golang.org/x/text v0.3.0 ) replace ( golang.org/x/text => github.com/golang/text v0.3.0 )
从 Go 1.11 版本开始,官方支持了 go module 包依赖管理工具。其实还新增了 GOPROXY 环境变量。若是设置了该变量,下载源代码时将会经过这个环境变量设置的代理地址,而再也不是之前的直接从代码库下载。好比咱们能够指定本身的代理地址。
更可喜的是,goproxy.io 这个开源项目帮咱们实现好了咱们想要的。该项目容许开发者一键构建本身的 GOPROXY 代理服务。同时,也提供了公用的代理服务 https://goproxy.io,咱们只需设置该环境变量便可正常下载被墙的源码包了:
export GO111MODULE=on export GOPROXY=https://goproxy.io
也能够经过置空这个环境变量来关闭,export GOPROXY=。
对于 Windows 用户,能够在 PowerShell 中设置:
$env:GOPROXY = "https://goproxy.io"
最后,咱们固然推荐使用 GOPROXY 这个环境变量的解决方式,前提是 Go version >= 1.11。
下载 golang.org/x/sys 包:
$ go get -u golang.org/x/sys
下载到的包在 $GPATH/pkg/mod/golang.org/x/