在 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,完全喪失掉了一枚程式設計師應當具有的沉著冷靜的風範。
我開始用搜索引擎尋找答案,發現找到的都是一些同類型的文章,而且大家的答案居然出奇的一致,就類似下面這樣:
- 之所以會出現這個原因,是因為 google 的相關網站被和諧掉了,因為下載不了相關工具
- 跟我一起來吧,讓我手摸手教你該怎麼完美解決這個問題。咳咳,這裡請自行腦部一下老司機的音容。
- 克隆 tools 這個 github 專案
- 在個人的資料夾內的 go 路徑中建立一份諸如
C:\Users\root\go\src\golang.org\x\tools
這種路徑的檔案目錄(博主按:這個步驟沒錯,但是不知道是出於疏忽還是疏忽,居然沒有一篇文章告訴你為什麼要這麼做) - 把克隆下來的 tools 資料夾覆蓋路徑中的同名資料夾
- 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 目錄下了。
後記
本來是一件很簡單很容易理解的事情,但是就是很難找到合適的直指核心本質的教程。
不得不感嘆,網際網路雖然資料很多,資訊繁雜,但是真正想找到對你有用的資料,卻如同大海撈針。
不要浮躁,多想多實踐,共勉吧!