原文链接: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 等各种方法,只需要配置一次,只要在任何原生命令前加前缀运行命令即可,效率很高。

实战操作

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

你需要准备如下工具:

  • 一个 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协议 许可协议。转载请注明出处!

【Go】go get 自动代理的更多相关文章

  1. 使用BeanNameAutoProxyCreator实现spring的自动代理

    提到代理,我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置 ...

  2. Spring AOP使用整理:自动代理以及AOP命令空间

    三.自动代理的实现 1.使用BeanNameAutoProxyCreator 通过Bean的name属性自动生成代理Bean. <bean class="org.springframe ...

  3. 浅析PAC,教你动手修改你的PAC文件及user-rule文件实现自动代理

    Shadowsocks作为现在一种很流行的穿墙工具,以其轻量级.速度感人等优点深受广大网友热捧.与VP_N相比,他就像一把锋利的”瑞士军刀”,不用受制于“系统全局代理”模式的困扰,控制更加便捷,基于S ...

  4. spring8——AOP之Bean的自动代理生成器

    对于上篇博客http://www.cnblogs.com/cdf-opensource-007/p/6464237.html结尾处提到的两个问题,可以使用spring提供的自动代理生成器解决.自动代理 ...

  5. SSM-Spring-15:Spring中名称自动代理生成器BeanNameAutoProxyCreator

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 名称自动代理生成器:BeanNameAutoProxyCreator 为了更好的测试,我放了俩个接口,俩个实现 ...

  6. SSM-Spring-14:Spring中默认自动代理DefaultAdvisorAutoProxyCreator

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 默认自动代理DefaultAdvisorAutoProxyCreator 本处没有什么要讲的,放原代码 ISo ...

  7. Spring框架学习08——自动代理方式实现AOP

    在传统的基于代理类的AOP实现中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大.解决方案:自动创 ...

  8. 浅析PAC,修改PAC文件及user-rule文件实现自动代理

    浅析PAC,修改PAC文件及user-rule文件实现自动代理 代理自动配置(英语:Proxy auto-config,简称PAC)是一种网页浏览器技术,用于定义浏览器该如何自动选择适当的代理服务器来 ...

  9. 用WPE+CCproxy+自动代理截取安卓游戏封包

    wpe三件套:https://pan.baidu.com/s/19gI2GPZ0iuu4wpKljCOn4A 用WPE+CCproxy+自动代理截取安卓游戏封包>>

随机推荐

  1. oracle odbc mysql 字段不全

    主要是字段集不对,mysql的字符集默认设置为utf8,odbc才是unicode编码连接,无法转发.选择ansi连接方式即可.

  2. Unity3D InputManager详解

    首先说一下 Input 类,这个类很常用,API 大家基本都知道,这里记录几个使用频率没那么高的 API Input.acceleration:重力加速度传感器的值,加速度的方向,适用于移动平台. I ...

  3. 检测MySQL主从备份是否运行

    通过查看 slave  状态,确保 Slave_IO_Running: Yes Slave_SQL_Running: Yes #!/bin/bash#Author:Darius-Dmysql -uro ...

  4. CSS3——animation的基础(轮播图)

    作为前端刚入门的小菜鸟,只想记录一下每天的小收获 对于animation动画 1.实现动画效果的组成: (1)通过类似Flash的关键帧来声明一个动画 (2)在animation属性中调用关键帧声明的 ...

  5. 面向对象一 OOP与类

    OOP面向对象 面向对象与面向过程 面向过程让计算机有步骤的顺次做一件事情,是一种过程化的叙事思维:面向对象是一种计算机世界里解决复杂软件工程的方法论,拆解问题复杂度,从人类思维角度提出解决问题的步骤 ...

  6. 项目设计day1

    项目内容:一个实时监控斗鱼TV某个主播弹幕的设计 通过python爬虫获取当前弹幕,通过flume采集数据,接下来数据分为线上和线下两种方案: 线上:实时分析,分为两种方案:(1) flume+kaf ...

  7. Express实例代码分析1——简单的用户验证登录文件

    /** * Module dependencies. */ var express = require('../..');// ../..是上级目录的上级目录 var hash = require(' ...

  8. JSP Ueditor 实现图片跨域上传

    Ueditor的单图上传,在官方文档上明确写了不支持 然后通过百度找了许多方案,终于有一个可以解决了. http://www.cnblogs.com/hpnet/p/6290452.html 不过那个 ...

  9. 玩转Kafka的生产者——分区器与多线程

    上篇文章学习kafka的基本安装和基础概念,本文主要是学习kafka的常用API.其中包括生产者和消费者, 多线程生产者,多线程消费者,自定义分区等,当然还包括一些避坑指南. 首发于个人网站:链接地址 ...

  10. ZJOI2019二试游记

    ZJOI2019二试游记 Day -2 今天就要去被虐了!开一篇占个坑.禁赛警告 Day -1 早上zzy,下午zzq,无限懵逼... 过来的时候Sooke,memset0,老K坐我旁边,瑟瑟发抖.. ...