1. 程式人生 > >在 vs code 中使用 go 外掛時相關工具的正確安裝方式

在 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\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 目錄下了。

後記

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

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

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