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

fengruoqing · · 1146 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

# 前言 最近在学习 go 语言,当然编辑器用的还是最熟悉的 vs code 了。 虽然说 vs code 着实很占内存,但是没办法,谁让他配置起来方便快捷,并且对于前端程序员来说,着实是一大开发利器。 之前也用过 sublime, notepad++ 等轻量级编辑器,但是自从用过了 vs code 以后,就再也用不回去了。着实有种“曾经沧海难为水,除却巫山不是云”的感觉。 写前端代码写习惯了,装个插件也是方便的狠,直接搜一下,然后点击安装,装好以后重启一下编辑器就能愉快的使用了。 但是这套经验对于我这个 go 的新手来说,却不是那么的适用了。 打开插件扩展,搜与 go 有关的插件,排在第一个的就是微软官方出品的 go 插件。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123129132.png) 当时一想,我就乐了,既然编辑器用的都是人家开源的产品,那么人家定制的 go 插件也没有理由不用了吧。 这一用不要紧,却让我后面折腾了好久,才搞明白,原来人家这插件是给你装上了个全家桶啊。 # 不断地报错 我天真的以为,装了这个插件以后,直接就能用了,哪曾想到,我 `shift + alt + F` 格式化代码的时候,就会蹦出下面类似的提醒: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123159643.png) 于是我就只能点个 Install All 了,却没想到每次 go 这个插件总是不断地提示安装失败了,大概就是输出下面这样的提示信息: ```javascript 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` 目录中的文件: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123229880.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70) 这一看,简直让我大跌眼镜,我终于明白了这个 vs code 中 go 这个插件到底干了啥,也明白了怎么才能正确的装上 go 插件调用的程序了。 # 阐述原理 原来 vs code 中的 go 插件,就是在 go 的环境变量中调用一些程序,来对 go 的源码执行一些检查、测试、格式化、重命名、代码检查等操作。 ## go 的 env 通过 `go env` 查看 go 的系统配置参数: ```bash 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 程序中经常会使用一些第三方的包,例如: ```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 页面: ![在这里插入图片描述](https://img-blog.csdnimg.cn/2018120112330484.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70) 看到这里,我想聪明的你不难明白,原来我们装的插件就是 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 git@github.com:sqs/goreturns.git` 命令,将项目克隆到我们本地。 以下是在我电脑上执行的过程,可以看出来下载网速较慢,因此花了很长时间: ```bash C:\Users\root\go\src\github.com\sqs>git clone git@github.com: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](https://coursera.org), 但是在家里却有不错的速度。 ## 编译成二进制文件 完全的将项目克隆下来了以后,接下来要做的就是将项目编译成对应的二进制文件。 其他插件安装的原理也是一样的,安装的过程也是大同小异,学会了下面这个范例,就能举一反三了。 ### 编译好后移到 \$GOPATH\bin 目录下 了解 go 的你,应该明白 go 源文件是怎么编译的吧。 我们仅仅只需要,在对应的项目路径下,执行 `go install` 命令,就能自动找对应的同名入口文件开始编译。 看看我们的 goreturns 项目: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181201123321628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70) 不看不觉得,一看我就觉得要吐血了,这位 sqs 用户,对我们中国的开发者“太不友好了”,整个项目其实很小,源代码就几十 kb,但是 sqs 居然朝里面塞了一个接近 6.5Mb 的 screencast.gif 文件。 然而,打开一看,也就是一个十秒左右的演示代码使用的录屏。这老哥(或老姐)不知道用的什么录制 gif 的软件,录屏的效率惊掉人的下巴了。 这也间接的“坑了”我们国内的开发者了,以我们克隆 github 项目的平均网速来看,本来十秒钟能克隆下来的项目,这下好了,十分钟也克隆不下来了。 执行了 go bulid 以后,我们的文件夹下就多了一个二进制文件 goreturns.exe 了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2018120112334486.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvdmVmZW5ncnVvcWluZw==,size_16,color_FFFFFF,t_70) 接下来要做的就是,将二进制文件**复制**或**剪切**到我们的 `$GOPATH\bin` 目录下就大功告成了。 ### 直接在 \$GOPATH\bin 目录下编译 在 `$GOPATH\bin` 目录下,直接执行命令 `go install github.com/sqs/goreturns` 命令,go 编译程序就会自动的到 `$GOPATH\src` 目录下,找到对应的 goreturns 包,对其进行编译,编译后得到的二进制文件就在当前所在的 bin 目录下了。 # 后记 本来是一件很简单很容易理解的事情,但是就是很难找到合适的直指核心本质的教程。 不得不感叹,互联网虽然资料很多,信息繁杂,但是真正想找到对你有用的资料,却如同大海捞针。 不要浮躁,多想多实践,共勉吧!

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1146 次点击  
加入收藏 微博
下一篇:go圣经(一)
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传