0%

VScode下的Go插件配置

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. 脚本自动化实现

  1. 思路说明

    • 首先,我们将插件和他们的安装包名建立一个map。

    • 其次,我们对这个map做一个遍历。

    • 将买一个MapEntry<path,pluginName>的key(即path)做split操作,然后根据分片后的数组建立目录结构。

    • 在每一个路径分片数组的末尾执行git clone操作

    • 接着,在成功后进行跳回顶层目录($(GOPATH))。

    • 此时,执行go install pluginName

    • 重复上面的过程直到遍历完毕,跟着再次跳回顶层目录($(GOPATH))。

  2. 实现脚本(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 方便国内用户更快的访问不能访问的包,真是良心。

参考资料