在 vs code 中使用 go 插件時相關工具的正確安裝方式

前言

最近在學習 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
    ootgosrcgolang.orgx ools 這種路徑的文件目錄(博主按:這個步驟沒錯,但是不知道是出於疏忽還是疏忽,居然沒有一篇文章告訴你為什麼要這麼做
  5. 把克隆下來的 tools 文件夾覆蓋路徑中的同名文件夾
  6. cd 到 C:Users
    ootgoin 目錄,開始執行一大串命令行命令

大多數文章,差不多到這裡就戛然而止了。

我照著文章反覆的執行了好多次,每一次都前功盡棄了。因為每每總是 fail 掉了,還是有一堆插件沒裝上。

就在我開始氣妥的時候,勝利的曙光終於來臨了,命運女神開始眷顧我了。

我鬼使神差的看了一眼 C:Users
ootgoin 目錄中的文件:

這一看,簡直讓我大跌眼鏡,我終於明白了這個 vs code 中 go 這個插件到底幹了啥,也明白了怎麼才能正確的裝上 go 插件調用的程序了。

闡述原理

原來 vs code 中的 go 插件,就是在 go 的環境變數中調用一些程序,來對 go 的源碼執行一些檢查、測試、格式化、重命名、代碼檢查等操作。

go 的 env

通過 go env 查看 go 的系統配置參數:

C:Users
oot>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:Users
ootAppDataLocalgo-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:Users
ootgo
set GOPROXY=
set GORACE=
set GOROOT=D:Softwarego
set GOTMPDIR=
set GOTOOLDIR=D:Softwaregopkg oolwindows_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
ootAppDataLocalTempgo-build998644522=/tmp/go-build -gno-record-gcc-switches

我們定位到 set GOPATH=C:Users
ootgo 這一行,不難發現,我們的 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/goreturn FAILED 這條提示信息我們可以看出來,這個插件所在的網址是多少。

我們打開我們的瀏覽器,在地址欄輸入 github.com/sqs/goreturn ,然後回車,就進入了插件的 github 頁面:

看到這裡,我想聰明的你不難明白,原來我們裝的插件就是 github 上開源的 go 插件,而 sqs 是用戶,goreturns 是項目名稱。

我們為了尊重插件的開發者,直接就按照 github 的頁面編排的目錄,直接把我們的項目克隆到 $GOPATHsrcgithub.comsqsgoreturns 文件夾之中。

所以我們就在 $GOPATHsrcgithub.com 目錄下,新建一個文件夾為 sqs 我想用過類 Unix 系統的用戶都應該明白了,我們相當於建了一個 sqs 用戶的個人文件夾,裡面可以放他個人的項目,而這個用戶本來是 github.com 的用戶。

打開我們的控制檯,在 $GOPATHsrcgithub.comsqs 路徑下,執行 git clone [email protected]:sqs/goreturns.git 命令,將項目克隆到我們本地。

以下是在我電腦上執行的過程,可以看出來下載網速較慢,因此花了很長時間:

C:Users
ootgosrcgithub.comsqs>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, 但是在家裡卻有不錯的速度。

編譯成二進位文件

完全的將項目克隆下來了以後,接下來要做的就是將項目編譯成對應的二進位文件。

編譯好後移到 $GOPATHin 目錄下

瞭解 go 的你,應該明白 go 源文件是怎麼編譯的吧。

我們僅僅只需要,在對應的項目路徑下,執行 go install 命令,就能自動找對應的同名入口文件開始編譯。

看看我們的 goreturns 項目:

不看不覺得,一看我就覺得要吐血了,這位 sqs 用戶,對我們中國的開發者「太不友好了」,整個項目其實很小,源代碼就幾十 kb,但是 sqs 居然朝裡面塞了一個接近 6.5Mb 的 screencast.gif 文件。

然而,打開一看,也就是一個十秒左右的演示代碼使用的錄屏。這老哥(或老姐)不知道用的什麼錄製 gif 的軟體,錄屏的效率驚掉人的下巴了。

這也間接的「坑了」我們國內的開發者了,以我們克隆 github 項目的平均網速來看,本來十秒鐘能克隆下來的項目,這下好了,十分鐘也克隆不下來了。

執行了 go bulid 以後,我們的文件夾下就多了一個二進位文件 goreturns.exe 了

接下來要做的就是,將二進位文件複製剪切到我們的 $GOPATHin 目錄下就大功告成了。

直接在 $GOPATHin 目錄下編譯

在 $GOPATHin 目錄下,直接執行命令 go install github.com/sqs/goreturn 命令,go 編譯程序就會自動的到 $GOPATHsrc 目錄下,找到對應的 goreturns 包,對其進行編譯,編譯後得到的二進位文件就在當前所在的 bin 目錄下了。

後記

本來是一件很簡單很容易理解的事情,但是就是很難找到合適的直指核心本質的教程。

不得不感嘆,互聯網雖然資料很多,信息繁雜,但是真正想找到對你有用的資料,卻如同大海撈針。

不要浮躁,多想多實踐,共勉吧!

推薦閱讀:

相關文章