自從 Windows 升級到 Windows 10 Version 2004 之後,因為可以採用效能大幅提昇的 WSL 2 執行環境,像是 .NET Core, Go 與 Docker 都會全部跑在 WSL 2 的 Linux 下。今天這篇文章,我將介紹如何在 Windows 平台打造完美的 Go 開發環境,不但可以讓你享受 Linux 平台執行時無比的順暢,更能享受 Windows 平台絕佳的 VSCode 開發體驗。
安裝 Go 版本管理器 (Go Version Manager)
Go Version Manager 簡稱 gvm
,專門用來管理 Go 的執行環境,可以讓你任意切換 Go 的 Runtime 版本,又不會搞亂你的作業系統,這可說是兩全其美!
以下兩行命令,就可以輕鬆裝好 gvm 工具:
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
source ~/.gvm/scripts/gvm
我之前有在 Go 的社群發起過一次問卷調查,調查後發現,有在使用 gvm 的人非常少,大家都不太有「多版本」的需求。主要原因在於,自從 Go 開始支援 Go Module 之後,已經很少有版本升級的問題,例如你要將 Go 1.13 升級到 Go 1.14 就不會太困難,就算有困難,也不會困難到需要同時使用多個 Go 版本。
另一方面來說,安裝 Go 執行環境的門檻已經變的超低,尤其是安裝在 Linux / macOS 底下更是如此,官方已經移除了對各家 Linux Distro 的安裝套件支援,一份 tarball 解壓縮,環境變數 PATH
設定好就可以立刻開始使用,沒那麼多奇奇怪怪的套件管理器混淆 Linux 初學者的地方。
不過,我認為安裝 gvm 對於打造 Go 開發環境來說,還是有好處的。至少安裝完成後的 Go 執行環境非常乾淨,各種複雜的 GO____
環境變數,全部交由 gvm 來管理。不想要 Go 或 gvm 的時候,只要以下兩行就可以清除乾淨:
chmod u+w -R ~/.gvm/
gvm implode
安裝 Go 執行環境
-
先安裝 gvm 所需的必要套件
因為 gvm 可能會用到建置下個版本的 Go 執行環境,所以建議你安裝一些建置工具。
如果你採用 Ubuntu/Debian 系統,請安裝以下套件:
sudo apt-get install binutils bison gcc make build-essential -y
如果有遇到不能執行上述安裝的情況,請用以下命令修復,修復後再重新安裝一次即可!
sudo sed -i -r -e 's/^(set -e)$/#\1/' /var/lib/dpkg/info/libc6\:amd64.postinst
sudo apt --fix-broken install -y
如果你採用 RedHat/CentOS 系統,請安裝以下套件:
sudo yum install curl
sudo yum install git
sudo yum install make
sudo yum install bison
sudo yum install gcc
sudo yum install glibc-devel
-
列出目前 gvm 已安裝的所有 Go 版本
gvm listall
撰文當下的回應內容如下:
gvm gos (available)
go1
go1.0.1
go1.0.2
go1.0.3
go1.1
go1.1rc2
go1.1rc3
go1.1.1
go1.1.2
go1.2
go1.2rc2
go1.2rc3
go1.2rc4
go1.2rc5
go1.2.1
go1.2.2
go1.3
go1.3beta1
go1.3beta2
go1.3rc1
go1.3rc2
go1.3.1
go1.3.2
go1.3.3
go1.4
go1.4beta1
go1.4rc1
go1.4rc2
go1.4.1
go1.4.2
go1.4.3
go1.5
go1.5beta1
go1.5beta2
go1.5beta3
go1.5rc1
go1.5.1
go1.5.2
go1.5.3
go1.5.4
go1.6
go1.6beta1
go1.6beta2
go1.6rc1
go1.6rc2
go1.6.1
go1.6.2
go1.6.3
go1.6.4
go1.7
go1.7beta1
go1.7beta2
go1.7rc1
go1.7rc2
go1.7rc3
go1.7rc4
go1.7rc5
go1.7rc6
go1.7.1
go1.7.2
go1.7.3
go1.7.4
go1.7.5
go1.7.6
go1.8
go1.8beta1
go1.8beta2
go1.8rc1
go1.8rc2
go1.8rc3
go1.8.1
go1.8.2
go1.8.3
go1.8.4
go1.8.5
go1.8.5rc4
go1.8.5rc5
go1.8.6
go1.8.7
go1.9
go1.9beta1
go1.9beta2
go1.9rc1
go1.9rc2
go1.9.1
go1.9.2
go1.9.3
go1.9.4
go1.9.5
go1.9.6
go1.9.7
go1.10
go1.10beta1
go1.10beta2
go1.10rc1
go1.10rc2
go1.10.1
go1.10.2
go1.10.3
go1.10.4
go1.10.5
go1.10.6
go1.10.7
go1.10.8
go1.11
go1.11beta1
go1.11beta2
go1.11beta3
go1.11rc1
go1.11rc2
go1.11.1
go1.11.2
go1.11.3
go1.11.4
go1.11.5
go1.11.6
go1.11.7
go1.11.8
go1.11.9
go1.11.10
go1.11.11
go1.11.12
go1.11.13
go1.12
go1.12beta1
go1.12beta2
go1.12rc1
go1.12.1
go1.12.2
go1.12.3
go1.12.4
go1.12.5
go1.12.6
go1.12.7
go1.12.8
go1.12.9
go1.12.10
go1.12.11
go1.12.12
go1.12.13
go1.12.14
go1.12.15
go1.12.16
go1.12.17
go1.13
go1.13beta1
go1.13rc1
go1.13rc2
go1.13.1
go1.13.2
go1.13.3
go1.13.4
go1.13.5
go1.13.6
go1.13.7
go1.13.8
go1.13.9
go1.13.10
go1.13.11
go1.13.12
go1.13.13
go1.13.14
go1.14
go1.14beta1
go1.14rc1
go1.14.1
go1.14.2
go1.14.3
go1.14.4
go1.14.5
go1.14.6
go1.15beta1
release.r56
release.r57
release.r58
release.r59
release.r60
release.r57.1
release.r57.2
release.r58.1
release.r58.2
release.r60.1
release.r60.2
release.r60.3
-
安裝 go1.14.6
版本
gvm install go1.14.6 --binary
-
列出目前 gvm 已安裝的所有 Go 版本
gvm list
-
設定目前要用的 Go 版本(並設定為預設版本)
gvm use go1.14.6 --default
-
確認目前執行的 Go 版本
go version
安裝 VSCode 需要的 go modules 與相關工具
-
若要從 VSCode 自動開啟網頁,就必須安裝 xdg-utils 套件
sudo apt install xdg-utils -y
-
以下是 Go 擴充套件 需要的 go modules
go get github.com/sqs/goreturns
go get github.com/mdempsky/gocode
go get github.com/uudashr/gopkgs/v2/cmd/gopkgs
go get github.com/ramya-rao-a/go-outline
go get github.com/acroca/go-symbols
go get golang.org/x/tools/cmd/guru
go get golang.org/x/tools/cmd/gorename
go get github.com/cweill/gotests/...
go get github.com/fatih/gomodifytags
go get github.com/josharian/impl
go get github.com/davidrjenni/reftools/cmd/fillstruct
go get github.com/haya14busa/goplay/cmd/goplay
go get github.com/godoctor/godoctor
go get github.com/go-delve/delve/cmd/dlv
go get github.com/stamblerre/gocode
go get github.com/rogpeppe/godef
go get golang.org/x/tools/cmd/goimports
go get golang.org/x/lint/golint
go get golang.org/x/tools/gopls
-
啟動 Visual Studio Code 開發工具
你現在可以在任何 WSL Distro 裡面直接輸入 code .
就可以開啟 Windows 環境下的 Visual Studio Code 開發工具!
code .
預設會自動安裝並載入 Visual Studio Code Remote - WSL 擴充套件。
-
安裝 Will 保哥 出品的 Go Extension Pack 擴充套件
快速鍵:Ctrl-Shift-X
> 搜尋: doggy8088.go-extension-pack
即可找到!
這份擴充套件包含了以下擴充套件:
- Go
- Code Runner
- Paste JSON as Code
- Gremlins tracker for Visual Studio Code
- vscode-proto3
-
執行 VSCode 中 Go 擴充套件的 Go: Install/Update Tools
命令一次
F1
> Go: Install/Update Tools
這個命令會自動安裝遺漏的套件,如果已經安裝過,也會自動更新套件!
-
調整 Visual Studio Code 使用者設定
在我的 Go Extension Pack 擴充套件說明頁面有提到幾個 Recommended Settings (建議設定),請記得要手動調整 Visual Studio Code 使用者設定之後才會好用,尤其是快速鍵部分!
其他推薦的 Visual Studio Code 擴充套件
- Control Snippets
- 可以關掉你不想要的 Code Snippets,無論是 VSCode 內建或是擴充套件安裝過的,都可以設定停用!
- https://github.com/Microsoft/vscode/issues/10565#issuecomment-520171990
- Git Graph
有其他推薦的 Visual Studio Code 擴充套件嗎?歡迎留言給我!🎉
測試是否安裝成功
-
確認目前執行的 Go 版本
go version
-
抓取 Go 套件原始碼回來測試用 VSCode 開啟專案
git clone https://github.com/appleboy/gorush.git
cd gorush
make
code .
-
新增 .vscode/tasks.json
設定檔
預設的「建置」與「測試」命令與參數,每個專案都可能有所不同,請記得手動調整過!
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "go",
"type": "shell",
"args": [
"build",
"-o",
"dist/${workspaceFolderBasename}"
],
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
},
{
"label": "test",
"command": "go",
"type": "shell",
"args": [
"test",
],
"group": {
"kind": "test",
"isDefault": true
},
"presentation": {
"reveal": "silent"
},
"problemMatcher": "$msCompile"
}
]
}
-
調整 Visual Studio Code 使用者設定
{
"go.useLanguageServer": true,
"editor.snippetSuggestions": "top",
"terminal.integrated.shellArgs.linux": ["-l"],
"code-runner.saveAllFilesBeforeRun": true,
"code-runner.ignoreSelection": true,
"code-runner.runInTerminal": true
}
相關連結