1. 必要资源说明
插件地址 | 插件名称 |
---|---|
github.com/mdempsky/gocode | gocode |
github.com/uudashr/gopkgs/cmd/gopkgs | gopkgs |
github.com/ramya-rao-a/go-outline | go-outline |
github.com/acroca/go-symbols | go-symbols |
golang.org/x/tools/cmd/guru | guru |
golang.org/x/tools/cmd/gorename | gorename |
github.com/derekparker/delve/cmd/dlv | dlv |
github.com/stamblerre/gocode | gocode-gomod |
github.com/rogpeppe/godef | godef |
github.com/ianthehat/godef | godef-gomod |
github.com/sqs/goreturns | goreturns |
golang.org/x/lint/golint | golint |
2. 脚本自动化实现
思路说明首先,我们将插件和他们的安装包名建立一个map。其次,我们对这个map做一个遍历。将买一个MapEntry<path,pluginName>的key
(即path)做split
操作,然后根据分片后的数组建立目录结构。在每一个路径分片数组的末尾执行git clone
操作接着,在成功后进行跳回顶层目录($(GOPATH)
)。此时,执行go install pluginName
重复上面的过程直到遍历完毕,跟着再次跳回顶层目录($(GOPATH)
)。
实现脚本(Python3
)install_plugin.pyview raw 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51#!/usr/local/bin/python3
# -*- coding:utf-8 -*-
import git
import os, subprocess
import shutil
result = os.popen("echo ~/go")
res = result.read()
go_path = res.splitlines()[0]
go_path_src = go_path + "/src"
os.chdir(go_path_src)
# 定义插件字典
entries = {
"gocode":"github.com/mdempsky/gocode",
"gopkgs":"github.com/uudashr/gopkgs",
"go-outline":"github.com/ramya-rao-a/go-outline",
"go-symbols":"github.com/acroca/go-symbols",
"guru":"golang.org/x/tools/cmd/guru",
"gorename":"golang.org/x/tools/cmd/gorename",
"dlv":"github.com/derekparker/delve/cmd/dlv",
"gocode-gomod":"github.com/stamblerre/gocode",
"godef":"github.com/rogpeppe/godef",
"godef-gomod":"github.com/ianthehat/godef",
"goreturns":"github.com/sqs/goreturns",
"golint":"golang.org/x/lint/golint"
}
for name,path in entries.items():
# 对路径进行分片
dirs = path.split('/')
git_name = dirs[-1]
dirs = dirs[0:-1]
root = go_path_src
os.chdir(root)
for dir_name in dirs:
dest = root+"/"+dir_name
if not os.path.exists(dest):
os.mkdir(dir_name)
print('mkdir '+ dest)
root = dest
print("enter dir "+ os.getcwd())
os.chdir(root)
print("current dir "+ os.getcwd())
clone_path = os.getcwd()+git_name
if os.path.exists(clone_path):
shutil.rmtree(clone_path)
print("git clone "+"https://"+path+".git")
repo = git.Repo.clone_from("https://"+path+".git",git_name)
3. 代理实现(正解
)下文引自格物
GOPROXY 环境变量
终于到了本文的终极大杀器 —— GOPROXY。
我们知道从 Go 1.11
版本开始,官方支持了 go module
包依赖管理工具。
其实还新增了 GOPROXY 环境变量
。如果设置了该变量,下载源代码时将会通过这个环境变量设置的代理地址,而不再是以前的直接从代码库下载。
更可喜的是,goproxy.io
这个开源项目帮我们实现好了我们想要的。该项目允许开发者一键构建自己的 GOPROXY
代理服务。同时,也提供了公用的[代理服务] (https://goproxy.io),我们只需设置该环境变量即可正常下载被墙的源码包了:
export GOPROXY=https://goproxy.io
不过,需要依赖于 go module
功能。可通过 export GO111MODULE=on
开启 MODULE。
如果项目不在 GOPATH
中,则无法使用 go get ...
,但可以使用 go mod ...
相关命令。
也可以通过置空这个环境变量来关闭,export GOPROXY=
。
对于 Windows
用户,可以在 PowerShell
中设置:
$env:GOPROXY = "https://goproxy.io"
最后,我们当然推荐使用 GOPROXY
这个环境变量的解决方式,前提是 Go version >= 1.11
。
最后的最后,七牛也出了个国内代理 goproxy.cn 方便国内用户更快的访问不能访问的包,真是良心。