konakona
Dream Afar.
konakona
使用Socket5 解决Go GET命令遇到https fetch failed (timeout)
使用Socket5 解决Go GET命令遇到https fetch failed (timeout)

本文已将所有go get超时的解决方式汇总,主要讲了以下几个点,建议认真阅读全文,不要错过。

  • SS客户端不支持https
  • 强调了CLI(命令行)下使用的是环境变量proxy的设置,而不是SS,所以SS全局模式在CLI下无效
  • Git设置Socks5代理访问仓库
  • 使用环境变量proxy实现全局走SS
  • VsCode设置proxy
  • 提供比go get 更符合国情的工具——https://gopm.io

前言

这几天pilipili源码的事儿闹得沸沸扬扬,与今天博客内容相结合的话题是`/Vendor`目录下的package被add到git origin仓库是不严谨的,这的确是一个很偷懒的做法。懒就懒在go get这些包很困难而不愿意去克服。

可能是因为开发和测试团队的人很多,为了避免能力参差不齐的人遇到部署开发环境障碍而造成人工生产能力的损失,直接就把vendor放进去了,这样大家就不需要go get了。

https://blog.img.crazyphper.com/2019/05/timg-150x150.jpeg

我们先来看下报错:

Fetching https://golang.org/x/tools/go/gcexportdata?go-get=1

https fetch failed: Get https://golang.org/x/tools/go/gcexportdata?go-get=1: dial tcp 61.91.161.217:443: i/o timeout
package golang.org/x/tools/go/gcexportdata: unrecognized import path "golang.org/x/tools/go/gcexportdata" (https fetch: Get https://golang.org/x/tools/go/gcexportdata?go-get=1: dial tcp 61.91.161.217:443: i/o timeout)

你是不是用SS全局模式都解决不了?你也设置了https.proxy了?哼哼……我也是……这个匪夷所思的问题随随便便都能搞几个小时。

准备工作

我先假设你具备了科学上网的工具,那么问题就好办了。比如SS,SS提供http和socket5代理,命令行可以使用http、https、socket5 。 

出现go get timeout的原因是SS不支持https proxy,全局模式不在cli里工作。

如果你没有科学上网的办法,就需要做很多主动下载和移动文件夹的操作(方法在这里),并不适合部署开发环境的需要。每一次有新的包需要添加/更新就要大量的操作。比如glide install和vs code package依赖包自动安装这些,都会受到限制。有条件还是解决科学上网再继续开发。

获取科学上网点这里,鄙人良心推荐,绝对不是为了推广费!2333

https://blog.img.crazyphper.com/2019/05/b6-645x600.png

在解决Go get这个问题上,wzw的站长提醒了我socket5这个方向——因为这终归是一个网络问题

当然你也可以使用国人激情奉献的包管理,https://gopm.io, 然后这篇文章就不用阅读啦!

第一步:设置Socket5代理访问仓库

首先找到你的socket5端口是多少,然后设置你的gitconfig ,我的socket5端口是1086。

https://blog.img.crazyphper.com/2019/05/b4-800x537.jpg

#先清空下你原本的设置,如果不需要,这2个命令可以不执行
#git config --global --unset http.proxy
#git config --global --unset https.proxy

#设置代理
git config --global http.proxy socks5://127.0.0.1:1086
git config --global https.proxy socks5://127.0.0.1:1086

PS:如果你无法确定自己的端口是多少,你可以使用常见的几个socket5端口来尝试,并用这条命令设置端口来测试一下。

ALL_PROXY=socks5://127.0.0.1:1086 /usr/local/go/bin/go get -u -v -t github.com/mdempsky/gocode

第二步:在命令行(CLI)下使用go get命令

接下来我们使用这条go get命令获取包,请将/usr/local/go/bin/go修改为你的$GOPATH

/usr/local/go/bin/go get -u -v -t github.com/mdempsky/gocode

啊啊,好了~

意外,Golang.org不行

https://blog.img.crazyphper.com/2019/05/b7-300x42.jpg

后续的安装过程中,我发现上面的方法成功只发生在github.com域名下。如果是golang.org则还是不行。可能是我SS的PAC规则里不含有golang.org导致的,golang.org是google(重点)主要原因还是国内政策太复杂……

$ host golang.org
golang.org is an alias for golang-consa.l.google.com.
golang-consa.l.google.com has address 216.239.37.1

这一次我尝试用系统环境代理设置来实现,用的是http代理,在命令行里输入如下命令:

export http_proxy=http://127.0.0.1:1087  # 代理地址需要换成自己的
export https_proxy=http://127.0.0.1:1087

https://blog.img.crazyphper.com/2019/05/b9-800x551.jpg

成功。我们再来看一下没有设置http_proxy和https_proxy的执行结果:

https://blog.img.crazyphper.com/2019/05/b10-800x198.jpg

果然一直timeout。

为了方便可以将这个设定写在用户环境变量里,MacOS是打开 vim ~/.bash_profile ,加入:

export http_proxy="http://localhost:1087"   
export https_proxy="http://localhost:1087"
export all_proxy="http:127.0.0.1:1087"

然后执行source ~/.bashrc,然后执行 curl ip.gs检测一下。

https://blog.img.crazyphper.com/2019/05/b11-800x357.jpg

VS CODE依然FAILD

CLI(命令行)下已经可以go get 到github.com和golang.org的package了。vs Code仍然是Failed Timeout,因为它还需要单独设置……

https://blog.img.crazyphper.com/2019/05/屏幕快照-2019-05-04-下午10.11.06-798x600.png

命令行下没有问题,但是VsCode里依然Timeout。

打开设置搜”proxy”,找到”Http: Proxy”,设置为http://127.0.0.1:1087 —— 你的代理IP和端口。

说好的“使用的代理设置。如果没有设置,将从 http_proxy 和 https_proxy 环境变量中获取。”呢?

https://blog.img.crazyphper.com/2019/05/屏幕快照-2019-05-04-下午10.16.55-800x469.png

Done!

总结

这个事儿真的特别恶心,使用PHP Composer的时候还只是跟github.com及packagist.org过过招,而且都是直达,没有cli跳转,所以也不用跟环境变量和socks5打交道。设置一下.gitconfig的proxy就可以用了。而且composer有很多国内的镜像选择,代理甚至可以不做。而GO很多包是直接用google.com(即golang.org)做源的,GG爸爸啊……6啊……我服!我折腾了将近4个小时。

大家会发现我从Git折腾过来的,最后发现可能go run是不走gitconfig的?直接设置环境变量就好?为此我尝试了注释掉~/.gitconfig文件中http_proxyhttps_proxy的socks5代理地址,go run果然不行了。所以都要加起来用才行。别漏看本文章中任何一句话哦~~~

https://blog.img.crazyphper.com/2019/05/屏幕快照-2019-05-04-下午10.34.37-300x191.png

扩展阅读

https://segmentfault.com/a/1190000018610099?utm_source=tag-newest

赞赏
https://secure.gravatar.com/avatar/3b712b34a0e1b689cfb524c9c6bcdc47?s=256&r=g

团哥

文章作者

继续玩我的CODE,让别人说去。 低调,就是这么自信。

发表评论

textsms
account_circle
email

konakona

使用Socket5 解决Go GET命令遇到https fetch failed (timeout)
本文已将所有go get超时的解决方式汇总,主要讲了以下几个点,建议认真阅读全文,不要错过。 SS客户端不支持https 强调了CLI(命令行)下使用的是环境变量proxy的设置,而不是SS,所以…
扫描二维码继续阅读
2019-05-04