在 vs code 中使用 go 插件时相关工具的正确安装方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lovefengruoqing/article/details/84672627

前言

最近在学习 go 语言,当然编辑器用的还是最熟悉的 vs code 了。

虽然说 vs code 着实很占内存,但是没办法,谁让他配置起来方便快捷,并且对于前端程序员来说,着实是一大开发利器。

之前也用过 sublime, notepad++ 等轻量级编辑器,但是自从用过了 vs code 以后,就再也用不回去了。着实有种“曾经沧海难为水,除却巫山不是云”的感觉。

写前端代码写习惯了,装个插件也是方便的狠,直接搜一下,然后点击安装,装好以后重启一下编辑器就能愉快的使用了。

但是这套经验对于我这个 go 的新手来说,却不是那么的适用了。

打开插件扩展,搜与 go 有关的插件,排在第一个的就是微软官方出品的 go 插件。

在这里插入图片描述

当时一想,我就乐了,既然编辑器用的都是人家开源的产品,那么人家定制的 go 插件也没有理由不用了吧。

这一用不要紧,却让我后面折腾了好久,才搞明白,原来人家这插件是给你装上了个全家桶啊。

不断地报错

我天真的以为,装了这个插件以后,直接就能用了,哪曾想到,我 shift + alt + F 格式化代码的时候,就会蹦出下面类似的提醒:
在这里插入图片描述

于是我就只能点个 Install All 了,却没想到每次 go 这个插件总是不断地提示安装失败了,大概就是输出下面这样的提示信息:

Installing github.com/derekparker/delve/cmd/dlv FAILED
Installing github.com/stamblerre/gocode FAILED
Installing github.com/ianthehat/godef FAILED
Installing github.com/sqs/goreturns FAILED

当然我这里就只是截取了小部分,因为我已经装好了,也懒得卸载了再演示了。

盲目的搜寻

开始我很盲目,没有冷静下来分析一下为什么会出现这个原因。现在想来,当时确实很 naive,完全丧失掉了一枚程序员应当具有的沉着冷静的风范。

我开始用搜索引擎寻找答案,发现找到的都是一些同类型的文章,而且大家的答案居然出奇的一致,就类似下面这样:

  1. 之所以会出现这个原因,是因为 google 的相关网站被和谐掉了,因为下载不了相关工具
  2. 跟我一起来吧,让我手摸手教你该怎么完美解决这个问题。咳咳,这里请自行脑部一下老司机的音容。
  3. 克隆 tools 这个 github 项目
  4. 在个人的文件夹内的 go 路径中创建一份诸如 C:\Users\root\go\src\golang.org\x\tools 这种路径的文件目录(博主按:这个步骤没错,但是不知道是出于疏忽还是疏忽,居然没有一篇文章告诉你为什么要这么做
  5. 把克隆下来的 tools 文件夹覆盖路径中的同名文件夹
  6. cd 到 C:\Users\root\go\bin 目录,开始执行一大串命令行命令

大多数文章,差不多到这里就戛然而止了。

我照着文章反复的执行了好多次,每一次都前功尽弃了。因为每每总是 fail 掉了,还是有一堆插件没装上。

就在我开始气妥的时候,胜利的曙光终于来临了,命运女神开始眷顾我了。

我鬼使神差的看了一眼 C:\Users\root\go\bin 目录中的文件:
在这里插入图片描述

这一看,简直让我大跌眼镜,我终于明白了这个 vs code 中 go 这个插件到底干了啥,也明白了怎么才能正确的装上 go 插件调用的程序了。

阐述原理

原来 vs code 中的 go 插件,就是在 go 的环境变量中调用一些程序,来对 go 的源码执行一些检查、测试、格式化、重命名、代码检查等操作。

go 的 env

通过 go env 查看 go 的系统配置参数:

C:\Users\root>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\root\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Users\root\go
set GOPROXY=
set GORACE=
set GOROOT=D:\Software\go
set GOTMPDIR=
set GOTOOLDIR=D:\Software\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\root\AppData\Local\Temp\go-build998644522=/tmp/go-build -gno-record-gcc-switches

我们定位到 set GOPATH=C:\Users\root\go 这一行,不难发现,我们的 go 程序的系统路径在什么地方。

通俗点来讲,我们在 go 程序中经常会使用一些第三方的包,例如:

import (
	"golang.org/x/tour/tree"
	"fmt"
)

我们编译我们的 go 程序的时候,就是从这个 gopath 下面的 src 文件夹中寻找我们的第三方包的。

换句话就是说,我们可以编写一些自己的 go 扩展包,放在这里文件夹里,然后就可以直接全局引用了。

go 插件的使用揭秘

虽然我没有看过 vs code 的 go 插件的源码,但是现在我刚大胆的说,我已经了解 go 插件的使用哲学了。

它其实并没有写具体的工具(这是我的猜想),对 go 的源码进行解析,而是调用 go 的一些优秀插件,对 go 源码执行一些操作。

也就是说,除了 go 官方自带的那些 格式化 等等插件以外,它会在 gopath 的 bin 目录下寻找对应的工具,对 go 源码执行操作。

如果这个工具没找到,每次就会不厌其烦的提醒你,你没有安装对应的工具,然后弹出提示框,问你要不要安装。

安装的时候,也是从对应的 go 工具的 github 网站或 golang 官网下载。下下来以后放在 src 文件夹内,然后通过 go install 包名 安装到 bin 目录下,供下次调用的时候使用。

因此,对于下载不下来的插件,我们可以手动的在 github 或 golang 网站找到对应的工具包,放在对应的目录中,然后对工具包进行编译,将编译后的二进制文件放在 bin 目录下即可。

安装范例

下面我就以安装 goturns 这个插件为例,介绍一下怎么手动安装这些老是安装不成功的插件。

克隆对应的项目到本地

Installing github.com/sqs/goreturns FAILED 这条提示信息我们可以看出来,这个插件所在的网址是多少。

我们打开我们的浏览器,在地址栏输入 github.com/sqs/goreturns ,然后回车,就进入了插件的 github 页面:
在这里插入图片描述

看到这里,我想聪明的你不难明白,原来我们装的插件就是 github 上开源的 go 插件,而 sqs 是用户,goreturns 是项目名称。

我们为了尊重插件的开发者,直接就按照 github 的页面编排的目录,直接把我们的项目克隆到 $GOPATH\src\github.com\sqs\goreturns 文件夹之中。

所以我们就在 $GOPATH\src\github.com\ 目录下,新建一个文件夹为 sqs 我想用过类 Unix 系统的用户都应该明白了,我们相当于建了一个 sqs 用户的个人文件夹,里面可以放他个人的项目,而这个用户本来是 github.com 的用户。

打开我们的控制台,在 $GOPATH\src\github.com\sqs\ 路径下,执行 git clone [email protected]:sqs/goreturns.git 命令,将项目克隆到我们本地。

以下是在我电脑上执行的过程,可以看出来下载网速较慢,因此花了很长时间:

C:\Users\root\go\src\github.com\sqs>git clone [email protected]:sqs/goreturns.git
Cloning into 'goreturns'...
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 152 (delta 3), reused 6 (delta 3), pack-reused 144
Receiving objects: 100% (152/152), 6.85 MiB | 5.00 KiB/s, done.
Resolving deltas: 100% (79/79), done.

这里不得不吐槽一下的是,不同电信运营商,对国外网站的支持程度也迥然不同。

我在公司克隆 github 项目,非常的快,但是在家里就慢的出奇。我在公司根本打不开 coursera, 但是在家里却有不错的速度。

编译成二进制文件

完全的将项目克隆下来了以后,接下来要做的就是将项目编译成对应的二进制文件。

其他插件安装的原理也是一样的,安装的过程也是大同小异,学会了下面这个范例,就能举一反三了。

编译好后移到 $GOPATH\bin 目录下

了解 go 的你,应该明白 go 源文件是怎么编译的吧。

我们仅仅只需要,在对应的项目路径下,执行 go install 命令,就能自动找对应的同名入口文件开始编译。

看看我们的 goreturns 项目:
在这里插入图片描述

不看不觉得,一看我就觉得要吐血了,这位 sqs 用户,对我们中国的开发者“太不友好了”,整个项目其实很小,源代码就几十 kb,但是 sqs 居然朝里面塞了一个接近 6.5Mb 的 screencast.gif 文件。

然而,打开一看,也就是一个十秒左右的演示代码使用的录屏。这老哥(或老姐)不知道用的什么录制 gif 的软件,录屏的效率惊掉人的下巴了。

这也间接的“坑了”我们国内的开发者了,以我们克隆 github 项目的平均网速来看,本来十秒钟能克隆下来的项目,这下好了,十分钟也克隆不下来了。

执行了 go bulid 以后,我们的文件夹下就多了一个二进制文件 goreturns.exe 了
在这里插入图片描述

接下来要做的就是,将二进制文件复制剪切到我们的 $GOPATH\bin 目录下就大功告成了。

直接在 $GOPATH\bin 目录下编译

$GOPATH\bin 目录下,直接执行命令 go install github.com/sqs/goreturns 命令,go 编译程序就会自动的到 $GOPATH\src 目录下,找到对应的 goreturns 包,对其进行编译,编译后得到的二进制文件就在当前所在的 bin 目录下了。

后记

本来是一件很简单很容易理解的事情,但是就是很难找到合适的直指核心本质的教程。

不得不感叹,互联网虽然资料很多,信息繁杂,但是真正想找到对你有用的资料,却如同大海捞针。

不要浮躁,多想多实践,共勉吧!

猜你喜欢

转载自blog.csdn.net/lovefengruoqing/article/details/84672627