【Go】go get 自动代理

原文链接:https://blog.thinkeridea.com/201903/go/go_get_proxy.html

最近发现技术交流群里很多人在询问 go get 墙外包失败的问题,大家给了很多解决方案:

  • 从 Github 的代码库 clone
  • 设置 GOPROXY 环境变量配置代理, 例如:GOPROXY=https://goproxy.io
  • 配置命令行代理,https_proxy 环境变量
  • 使用 go mod replace
  • 使用 Gopm 类似的工具
  • ……

Go 的社区很活跃,国内 gopher 对 Go 的热情不会因为墙的存在而减少,从社区想到这么多翻墙方案就能看出来了。

上面的方法都是可行的,但是总有一些不尽人意,社区也一直在找更好的方法,我一直使用自动代理的方式获取墙外的包,可以支持所有 Go 原生拉取包操作,比如 go get、go mod、dep、godep、glide 等各种方法,只需要配置一次,只要在任何原生命令前加前缀运行命令即可,效率很高。

<!--more-->

实战操作

工具类就先不讲原理,想直接获取方法的同学看这一部分即可,想了解原理的同学可以看后面的原理部分

你需要准备如下工具:

  • 一个 http 代理
  • Git
  • Github 账号设置好 ssh
  • 其它 git 相关服务设置好 ssh (例如自建 gitlab)
  • 一个可以运行shell的环境 (linux、Mac、windows 可以使用 git bash)

具体步骤

  • 首先通过 git 设置需要不代理的网站,以 Github 为例,执行 git config --global url.git@github.com:.insteadof https://github.com/ 从 https 转到 ssh 协议,这样会使我们设置的 https 代理不作用在 ssh 协议上,如果有自建的服务只要更换地址就可以了。
  • 新建一个脚本 (proxy),修改里面的代理地址为自己的代理地址,如下:

    #!/usr/bin/env bash 
    # 如果你的系统没有bash,或者没有 /usr/bin/env ,请修改上一行指令为你的环境
    export http_proxy=http://127.0.0.1:1087  # 代理地址需要换成自己的
    export https_proxy=http://127.0.0.1:1087
    export ftp_proxy=http://127.0.0.1:1087
    
    exec ${@:1}
  • 给 shell 脚本设置可执行权限,然后放到 path 环境变量路径下。
  • 测试 proxy curl https://www.google.comcurl https://www.google.com 第一个命令可以获取到结果,第二个命令不可以。
  • 测试 proxy go get -v golang.org/x/text/… 可以正常下载包,其它任何拉取包命令都可以添加 proxy 前缀执行 ,比如 proxy dep ensure -v

截止当前你就配置了一个 go get 自动代理的环境,以后需要翻墙操作的指令运行时加 proxy 就可以了,该方法并不只适用于 go get,任何需要命令行代理都可以使用。

原理篇

实际原理简单,找到这种方法也是一种巧合,在入坑 Go 之前我经常用 linux,当时有一些需求需要命令行翻墙,找到了三个环境变量 http_proxyhttps_proxyftp_proxy,但是全局设置导致很多请求变慢,如果在一个窗口临时设置就导致需要记住那个窗口设置了代理,切换窗口成本也比较高,后来根据 shell 的特性,任何一个脚本都有自己独立的环境变量,所以用一个脚本设置代理环境变量,exec ${@:1} 可以执行脚本后面的指令,也就是我们实际需要运行的指令,这样在需要代理的命令前就加上这个脚本前缀就好了,单行命令代理就这么简单的配置好了。

前期我使用 go 的时候遇到下载不了的包时,就会在 go get 前加上 proxy 指令,但是我发现拉取 Github 包的效率非常低,本身国内现在访问 Github 已经很快了。也是一个巧合,当时我公司 Go 项目迁移到 Github 上,所有项目全部是私有项目,有同事提供了一个 git https 转 ssh 协议的操作,git config --global url.git@….:.insteadof https://…./,这个操作让我看到一个隐性福利,之前的代理只会代理 https 并不能代理 ssh 协议,那么使用这个指令把不需要代理的网站全部转成 ssh 协议,然后加上 proxy 运行 go get 就成了自动代理了,尝试之后确实效率很高,至此一直使用到今天。

转载:

本文作者: 戚银(thinkeridea

本文链接: https://blog.thinkeridea.com/201903/go/go_get_proxy.html

版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!

一枚有点想法,喜技术,爱钻研的码农。

224 声望
308 粉丝
0 条评论
推荐阅读
【Go】四舍五入在go语言中为何如此困难
而在 Go 语言中这似乎成为了难题,在 stackoverflow 上搜索 [go] Round 会存在大量相关提问,Go 1.10 开始才出现 math.Round 的身影,本以为 Round 的疑问就此结束,但是一看函数注释 Round returns the nearest ...

thinkeridea1阅读 7.8k

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin21阅读 2.8k评论 3

封面图
SegmentFault 思否正式开源问答社区软件 Answer
作为国内领先的新一代技术问答社区,SegmentFault 思否团队在社区建设上有着多年积累。Answer 不仅拥有搭建问答平台(Q&A Platform)的基础功能,还在产品设计上融入了开发团队对社区发展的思考,并将其经验产品...

SegmentFault思否29阅读 4.2k评论 14

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀21阅读 54.6k评论 1

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100214阅读 11k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100213阅读 11.1k评论 4

【已结束】SegmentFault 思否技术征文丨浅谈 Go 语言框架
亲爱的开发者们:我们的 11 月技术征文如期而来,这次主题围绕 「 Go 」 语言,欢迎大家来参与分享~征文时间11 月 4 日 - 11 月 27 日 23:5911 月 28 日 18:00 前发布中奖名单参与条件新老思否作者均可参加征文...

SegmentFault思否11阅读 4.6k评论 11

封面图

一枚有点想法,喜技术,爱钻研的码农。

224 声望
308 粉丝
宣传栏