From:https://segmentfault.com/a/1190000018264719

问题描述

在 ubuntu 上用 sudo apt install golang-go 安装 go 的 sdk,之后使用 go getgo installgo 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)

解决方式

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

1. 手动下载

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

go 环境变量

export GOROOT=/usr/local/go
export GOPATH=/home/king/go      # root用户可以设置为 export GOPATH=/root/go
export 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/golang.org/x/cd $GOPATH/src/golang.org/x/git clone https://github.com/golang/net.git net go install net

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

go get github.com/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/golang.org/x/cd $GOPATH/src/golang.org/x/git clone https://github.com/golang/net.git
git clone https://github.com/golang/sync.gitgo install net
go install sync

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

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

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

git clone https://github.com/golang/tools.git

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

get grpc 包的时候

$ go get google.golang.org/grpc

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

go install google.golang.org/grpc

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

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

git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net

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

go install google.golang.org/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,就是为了解决包的别名问题,也能替我们解决 golang.org/x 无法下载的的问题。

go module 被集成到原生的 go mod 命令中,但是如果你的代码库在 $GOPATH 中,module 功能是默认不会开启的,想要开启也非常简单,通过一个环境变量即可开启 export 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 等这类第三方包管理工具,都不同方式的解决方案提供给我们。

4. GOPROXY 环境变量

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

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

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

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

# Enable the go modules feature
export GO111MODULE=on
# Set the GOPROXY environment variable
export 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 modules
  • goproxy.io

一键解决 go get golang.org/x 包失败相关推荐

  1. go get golang.org/x 包失败解决方法

    go get golang.org/x 包失败解决方法 参考文章: (1)go get golang.org/x 包失败解决方法 (2)https://www.cnblogs.com/hupeng12 ...

  2. 解决vscode中golang插件依赖安装失败问题

    解决vscode中golang插件依赖安装失败问题 参考文章: (1)解决vscode中golang插件依赖安装失败问题 (2)https://www.cnblogs.com/feiquan/p/11 ...

  3. 最简单解决VSCode中Golang插件依赖安装失败问题

    1. 配置好 Go 相关的环境变量,很多文章有说,这里就跳过了: 2. 参考 goproxy.io ,打开 cmd ,输入 go env -w GOPROXY=https://goproxy.io,d ...

  4. linux 使用 go get 报 unrecognized import path “golang.org/x/crypto/XXX“ 的解决方法及手动安装 golang.org/x 包方法

    问题描述 在linux上使用 go get -u github.com/astaxie/beego ,安装beego框架环境时报 unrecognized import path "gola ...

  5. golang 关于golang.org/x包问题

    关于golang.org/x包问题 由于谷歌被墙,跟谷歌相关的模块无法通过go get来下载,解决方法: git clone https://github.com/golang/net.git $GO ...

  6. golang中的包管理工具——govendor和godep简单学习

    为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...

  7. go get golang.org/x/tools 失败解决

    go get golang.org/x/tools失败 大陆不能访问golang.org,所以使用 go get golang.org/x/xxx 包的时候都会失败,比如安装tools包 go get ...

  8. 解决npm下载包失败的问题

    解决npm下载包失败的问题 参考文章: (1)解决npm下载包失败的问题 (2)https://www.cnblogs.com/rengised/p/6682235.html 备忘一下.

  9. 成功解决pyinstaller生成exe缺少各种包的问题

    成功解决pyinstaller生成exe缺少各种包的问题 目录 解决问题 解决方法 解决问题 成功解决pyinstaller生成exe缺少各种包的问题 解决方法 将缺少包的路径,如找不到自定义的yol ...

最新文章

  1. 会php学node要多久,php开发需要会node吗
  2. Linux之文件管理命令
  3. day21IO流+FIle递归
  4. 标记三维点_三维扫描仪对汽车钣金外形检测折弯件钣金件热成型加工件的应用...
  5. 挤牙膏只服英特尔!新酷睿14nm+++,性能竟超过AMD 7nm?
  6. 30岁前不必在乎的28件事
  7. 深入探讨struts的ActionMessages消息机制(转)
  8. how to handdraw a web UI for applications? Figma
  9. c++ file* 句柄泄漏_C++核心准则?讨论:持有没有被句柄管理的资源时切勿抛出异常...
  10. 前端学习(2926):vue改变样式2
  11. 基于 Tracing 数据的拓扑关系生成原理
  12. CentOS 7.4 安装Nginx
  13. 银行的起源---》阮一峰,
  14. 刘意 java基础视频_传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~day23)(2016年4月8日13:28:21)...
  15. grep的-A-B-选项详解(转)
  16. 【DirectX学习笔记】02_D3D初始化
  17. 备忘录-UE4切出焦点掉帧问题
  18. 编写程序获取 vector 容器的第一个元素。分别使用下标 操作符、front 函数以及 begin 函数实现该功能,并提 供空的 vector 容器测试你的程序
  19. Win11任务栏太宽了怎么办?教你一招快速修改任务栏大小
  20. 国美被曝停发员工工资;支付宝正式接入鸿蒙生态;推特遭到集体诉讼;小马智行业务调整,多位高管离职 | 每日大事件...

热门文章

  1. Spring Cloud实战小贴士:健康检查
  2. 论文浅尝 | Hike: A Hybrid Human-Machine Method for Entity Alignment
  3. 文本摘要综述-bertsum、BottleSum、TextRANk
  4. 【LeetCode】3月22日打卡-Day7
  5. 论文学习11-Adversarial training for multi-context joint entity and relation extraction(实体关系买抽取模型,对抗学习
  6. 2021-11-06深度学习
  7. 介绍一些知识图谱的实际应用类项目
  8. 『实践』Matlab实现Flyod求最短距离及存储最优路径
  9. Python 模块(二)
  10. 获取应用程序信息.h