go get 获取被墙依赖包解决方法

前言:git

随着 go1.11 的发布,go 官方引入了 go module 来解决依赖管理问题,go module 被集成到原生的 go cmd 中,可是若是你的代码库在$GOPATH中,go1.11 的 module 功能是默认不会开启的,想要开启也很是简单, 经过一个环境变量便可开启go module:export GO111MODULE=ongithub

 

关于 $GOPROXYgolang

当咱们使用go的时候,go默认会直接从代码库中去下载所需的相关依赖,GOPROXY 这个环境变量可让咱们控制本身从哪里去下载源代码,若是 GOPROXY 没有设置,go 会直接从代码库下载相关依赖代码。若是你像下面这样设置了这个环境变量,那么你就会经过 goproxy.io 下载全部的源代码。 安全

export GOPROXY=https://goproxy.io设计

你能够经过置空这个环境变量来关闭,export GOPROXY= 。code

之前你们执行 go get golang.org/x/net net代码库会下载到本地GOPATH中,之后有任何项目引用到了 golang.org/x/net 都不会再去下载这个代码库,由于本地GOPATH已经有了,哪怕版本不对,golang也会引用。可是随着 module 概念引入go语言,每一个引入的 module 拥有了 version。随着代码库的不断更新迭代,你们即便是对同一个代码库的引用也可能用了不一样的tag 或者 commit hash,基于这个现状,go1.11 的 module 会比之前更频繁的下载源代码。可是基于中国有中国特点的互联网,咱们有时候很难get到咱们须要的依赖源代码,进而致使项目编译失败,CI失败。因而,咱们须要一个proxy。ip

goproxy.io部署

goproxy.io 是一个开源项目,当用户请求一个依赖库时,若是它发现本地没有这份代码就会自动请求源,而后cache到本地,用户就能够从 goproxy.io 请求到数据。固然,这些都是在一个请求中完成的。goproxy.io 只支持 go module 模式。当用户执行 go get 命令时,会去检查$GOPROXY//@v/list这个文件中是否有用户想要获取的版本,若是有,就依次获取 $GOPROXY//@v/.info、$GOPROXY//@v/.mod、$GOPROXY//@v/.zip 等文件,若是没有就直接从源码库中去下载。get

得益于 go module 在设计的时候很是重视安全这个领域,因此在启用了 go module 后,你会发现除了 go.mod 这个文件以外,还有一个 go.sum 文件,这个文件保存了每一个依赖库的对应的hash值,来保证下载回来的代码库是正确的,不被人篡改的。同时, goproxy.io 也是个开源的项目。能够自行部署到本身的IDC中,由于公司内部本身的代码库 goproxy.io 是没法访问到的。开源地址:cmd

https://github.com/goproxyio/goproxy

References:

https://goproxy.io

https://github.com/goproxyio/goproxy

https://research.swtch.com/vgo-intro

https://docs.gomods.io