失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 一键解决 go get golang.org/x 包失败

一键解决 go get golang.org/x 包失败

时间:2019-10-10 23:04:31

相关推荐

一键解决 go get golang.org/x 包失败

From:/a/1190000018264719

问题描述

在 ubuntu 上用sudo apt install golang-go安装 go 的 sdk,之后使用go getgo installgo mod等命令时 (会自动下载相应的包或依赖包) 时,但由于众所周知的原因(),类似于/x/...的包会出现下载失败的情况。如下所示:

$ go get -u /x/sysgo get /x/sys: unrecognized import path "/x/sys" (https fetch: Get /x/sys?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

解决方式

那我们该如何解决问题呢?下面列出几种方法。

1. 手动下载

golang 在 github 上建立了一个镜像库,下载 github 上的镜像库放入 GOPATH 下即可。比如/x/net 对应/golang/net.git 。所以,我们可以手动下载 或 clone 对应的 GitHub 仓库到指定的目录下。

go 环境变量

export GOROOT=/usr/local/goexport GOPATH=/home/king/go# root用户可以设置为 export GOPATH=/root/goexport PATH=$PATH:$GOROOT/bin

GOROOT为安装目录GOPATH是 go 的工作区,代码和工程都可以添加到这里。

解决方法如下:

vim ~/.bashrc 或者vim /etc/profile

GG 到最后一行,添加:

export GOPATH=/root/go/

使配置生效

source .bashrc

安装 go 的 net 包。

mkdir -p $GOPATH/src//x/cd $GOPATH/src//x/git clone /golang/net.git net go install net

再之后,就可以愉快的 get了,比如如下:

go get /lucas-clemente/quic-go

如果用源码安装 go,那么 install 会设置 GOPATH 和 net 的,看来 apt-get 就是一时爽,补丁还得自己打。

如果报 “golang 程序编译时提示“package runtime: unrecognized import path "runtime" (import path does not begin with hostname)” ,可以执行:unset GOROOT 解决问题;

mkdir -p $GOPATH/src//x/cd $GOPATH/src//x/git clone /golang/net.gitgit clone /golang/sync.gitgo install netgo install sync

项目放在 $GOPATH/src,执行 go get 即可成功。其它 /x 下的包获取皆可使用该方法。

例如,很多go的软件在编译时都要使用tools里面的内容,使用下面方法获取:

进入上面的 x 目录下,输入:

git clone /golang/tools.git

注意:一定要保持与 go get 获取的目录结构是一致的,否则库就找不到了。

get grpc 包的时候

$ go get /grpc

发现拉不下来被墙了,在 上搜索 grpc,clone 到工程目录中,运行命令

go install /grpc

拿到了一些丢失的依赖包,比如:

进入 /golang 仓库找到对应的包,git clone下来,放到指定的目录中,比如上图缺少的 /x/net/http2包,在 github 上把 net 包 clone 下来,如下:

git clone /golang/net.git $GOPATH/src//x/net

其他包也如此操作,全部完成后,再运行

go install /grpc

成功,问题解决。

当如果需要指定版本的时候,该方法就无解了,因为 GitHub 上的镜像仓库多数都没有 tag。并且,手动嘛,程序员怎么能干呢,尤其是依赖的依赖,太多了。

go build -a -x -v

加上-a 强制go重新编译。

2.设置代理

如果你有代理,那么可以设置对应的环境变量:

export http_proxy=http://proxyAddress:portexport https_proxy=http://proxyAddress:port

或者,直接用all_proxy

export all_proxy=http://proxyAddress:port

3.go mod replace

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

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

以下为参考示例:

module /hellorequire (/x/text v0.3.0)replace (/x/text => /golang/text v0.3.0)

类似的还有glide、gopm等这类第三方包管理工具,都不同方式的解决方案提供给我们。

4.GOPROXY 环境变量

终于到了本文的终极大杀器 ——GOPROXY

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

其实还新增了GOPROXY环境变量。如果设置了该变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。这无疑对我等无法科学上网的开发良民来说是最大的福音。

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

# Enable the go modules featureexport GO111MODULE=on# Set the GOPROXY environment variableexport GOPROXY=https://goproxy.io

把上面配置写入到.bashrc或者.bash_profile文件。重启系统使配置生效。

如果项目不在GOPATH中,则无法使用go get ...,但可以使用go mod ...相关命令。也可以通过置空这个环境变量来关闭,export GOPROXY=

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

# Enable the go modules feature$env:GO111MODULE="on"# Set the GOPROXY environment variable$env:GOPROXY="https://goproxy.io"

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

参考资料

goproxy.io for Go modulesgoproxy.io

如果觉得《一键解决 go get golang.org/x 包失败》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。