對於大型的 Golang 項目往往我都會使用 Goland 這樣的專業 IDE,但是由於我本地開發環境硬件資源偏低,不能很順暢的使用 Goland,這個時候我們可以考慮使用 VSCode 來代替 Goland,而且 VSCode 還支持遠程開發,所以我索性將開發環境放在遠程機器上,然后用 VSCode 遠程開發模式進行連接,最主要的是大部分我們的項目都是直接跑在 Linux 上面的,這個時候我們就可以直接在 VSCode 中運行 Linux 環境下面的應用,而且我們還可以很好地進行調試,也降低了本地的資源占用。
遠程配置
VSCode 的 Remote 功能由三個插件組成,分別實現三種不同場景的遠程開發。
- Remote - SSH:利用 SSH 連接遠程主機進行開發。
- Remote - Container:連接當前機器上的容器進行開發。
- Remote - WSL:在Windows 10上,連接子系統(Windows Subsystem for Linux)進行開發。
我們這里使用 SSH 模式進行配置,SSH 模式的原理如下圖所示:
首先我們這里在本地環境 Mac 上安裝上 VSCode,遠程開發的機器 IP 為 192.168.31.104,配置該節點可以本地通過 SSH 遠程連接。然后在 VSCode 中安裝 Remote SSH 插件:
安裝了 Remote - SSH 擴展后,你會在最左邊看到一個新的狀態欄圖標。
遠程狀態欄圖標可以快速顯示 VS Code 在哪個上下文中運行(本地或遠程),點擊該圖標或者點擊 F1 按鍵然后輸入remote-ssh 便會彈出 Remote-SSH 的相關命令。
選擇 "Remote-SSH: Connect to Host"
命令,然后按以下格式輸入遠程主機的連接信息,連接到主機:user@hostname
,然后根據提示輸入登錄的密碼。
VSCode 將打開一個新窗口,然后你會看到 "VSCode 服務器 "正在 SSH 主機上初始化的通知,一旦 VSCode 服務器安裝在遠程主機上,它就可以運行擴展並與你的本地 VSCode 實例通信了。通過查看狀態欄中的指示器,可以知道已連接到虛擬機了,它顯示的是你的虛擬機的主機名。
Remote-SSH 擴展還在你的活動欄上添加了一個新的圖標,點擊它將打開遠程瀏覽器。從下拉菜單中,可以選擇 SSH 目標,在這里你可以配置你的 SSH 連接。
一旦你連接到你的 SSH 主機,你就可以與遠程機器上的文件進行交互l ,如果你打開集成終端(`⌃``),你會發現現在我們是在遠程的 Linux 下面了。
現在我們可以使用 bash shell 瀏覽遠程主機上的文件系統,還可以使用 "文件">"打開文件夾"
瀏覽和打開遠程主目錄上的文件夾。
此外,如果我們開發的是 WEB 應用,為了能夠瀏覽到遠程主機上的應用,我們可以利用另一個端口轉發
的功能來實現。
環境配置
現在我們已經可以在 VSCode 中進行遠程開發了,接下來我們以開源項目 KinD 為例來說明如何進行遠程調試。
KinD 是一個使用 Docker 容器
節點
運行本地 Kubernetes 集群的工具,主要是為了測試 Kubernetes 本身而設計的,但也可以用於本地開發或CI 測試。
首先在遠程主機上 Clone 代碼(也可以直接通過 VSCode Clone 操作):
cnych@ubuntu:~/Github$ git clone https://github.com/kubernetes-sigs/kind.git
cnych@ubuntu:~/Github$ git checkout v0.9.0
cnych@ubuntu:~/Github$ git checkout -b dev
然后在 VSCode 中定位到該項目,打開該項目。由於我們這是一個 Golang 項目,當然首先要做的是在遠程主機上安裝 Golang 的游戲環境。然后當然需要在 VSCode 中安裝 Golang 的插件,但是要注意的是我們需要安裝到遠程主機上,切換到 EXTENSIONS 頁面,輸入 Go,選擇 Go 插件,然后在插件頁面我們可以看到一個 Install on SSH: 192.168.31.104
的按鈕,點擊這個按鈕按鈕就可以將該插件安裝到遠程主機上:
安裝完成后,還需要安裝一些相關的命令行工具,可以查看 www.sangpi.com 了解相關信息。同樣在 VSCode 中輸入 F1 按鍵,然后輸入 Go 關鍵字,可以列出和 Go 相關的操作:
我們要做的是選擇第一條命令:Go: Install/Update Tools
,選擇所有的命令行工具,點擊 OK
按鈕便會在遠程主機上安裝這些工具:
不過需要注意的是這些工具或多或少需要一些科學方法才能下載成功,我們也可以手動下載這些工具放到 GOBIN
目錄下面即可。
這些命令行工具配置完成后,我們就可以在項目中使用這些工具了,在 KinD 項目根目錄下面創建 .vscode 目錄,在目錄下面新建 settings.json 文件,該文件就是來配置 VSCode 的,我這里使用的配置信息如下所示,我們可以根據自己的實際需求進行配置:
{
"workbench.editor.enablePreview": false,
"editor.fontLigatures": true,
"editor.fontSize": 20,
"editor.fontFamily": "'Ubuntu Mono derivative Powerline'",
"terminal.integrated.fontFamily": "'Ubuntu Mono derivative Powerline'",
"terminal.integrated.fontSize": 17,
"workbench.fontAliasing": "antialiased",
"go.inferGopath": false,
"go.autocompleteUnimportedPackages": true,
"go.useLanguageServer": true,
"go.lintTool": "golangci-lint",
"go.docsTool": "godoc",
"go.buildFlags": [],
"go.lintFlags": [],
"go.vetFlags": [],
"go.gocodePackageLookupMode": "go",
"go.gotoSymbol.includeImports": true,
"go.useCodeSnippetsOnFunctionSuggest": true,
"go.useCodeSnippetsOnFunctionSuggestWithoutType": true,
"go.formatTool": "goreturns",
"go.gocodeAutoBuild": false,
"go.liveErrors": {
"enabled": true,
"delay": 0
}
}
現在在 VSCode 終端的項目目錄下面執行如下命令更新依賴:
cnych@ubuntu:~/Github$ export GOPROXY="https://goproxy.cn"
cnych@ubuntu:~/Github$ go mod tidy
現在我們就可以在 VSCode 中查看項目了,可以快速跟蹤代碼,也有代碼提示,基本上 IDE 有的功能,在 VSCode 中都有:
不過對於大型 Golang 項目使用 VSCode 不方面的一個地方是不能快速定位到接口的實現,因為 Golang 中的接口很可能有多個地方都有實現,這點 VSCode 就沒有 Goland 方便了,不過我們也還是可以使用快捷方式找到接口的實現,我們可以將鼠標定位到接口名稱或者接口方法聲明上,然后通過快捷鍵Cmd(Windows 下面是 Ctrl)+ F12
就可以找到對應的實現,當然也可以通過右鍵查找所有實現:
遠程調試
現在我們已經可以使用 Remote-SSH 插件開發項目了,但是在開發過程中或者學習開源項目的時候往往少不了調試,特別是要想快速了解開源項目的實現,單步調試跟蹤代碼是非常好的一種方式,比如我們要來跟蹤下 KinD 是如何創建集群的,我們就可以在 KinD 創建集群的某些代碼片段上打上端點,然后單步調試進行跟蹤。
比較幸運的時候 VSCode 就可以很好的來幫助我們進行調試的操作。Golang 項目的調試是依賴delve
這個工具的,上面安裝命令行工具的時候已經安裝了,如果沒有安裝,我們可以使用如下方式進行手動安裝:
$ go get -u github.com/go-delve/delve/cmd/dlv
安裝完成后需要配置調試工具,F1 輸入 Debug: Open launch.json
打開 launch.json
文件。
如果第一次打開,會新建一個配置文件,默認配置內容如下所示:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}",
"env": {},
"args": []
}
]
}
常見的配置屬性:
我們還可以在配置文件中使用一些內置的變量:
${workspaceFolder}
調試 VS Code 打開工作空間的根目錄下的所有文件${file}
調試當前文件${fileDirname}
調試當前文件所在目錄下的所有文件
比如我們要調試 KinD 的創建集群的命令,對應的launch.json
文件內容如下所示:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Kind",
"type": "go",
"request": "launch",
"mode": "debug",
"host": "127.0.0.1",
"port": 2345,
"program": "${workspaceFolder}/main.go",
"cwd": "${workspaceFolder}",
"env": {},
"args": ["create", "cluster"]
}
]
}
然后在創建集群的代碼片段中打上端點,比如在 pkg/cluster/internal/create/create.go 文件的 Cluster 函數中打上兩個端點(在左側點擊一下即可):
然后在左側切換到調試,點擊我們上面配置的 Debug Kind
按鈕(或者使用 F5 按鍵)即可開始調試:
開始調試后, delve 會在遠程主機上啟動一個無頭服務,監聽在 2345 端口上,正常這個時候我們的程序會運行到我們上面打的斷點位置停下來:
這個時候我們可以看到已經初始化的變量信息,在最上方也有調試的工具欄,當然也有對應的快捷鍵,F5:繼續
、F10:單步執行
、F11:進入函數內部執行
,這幾個快捷鍵是最常用的,當然如果你的快捷鍵有沖突我們可以直接使用上面的工具欄進行操作。在操作的過程中產生的日志信息也會出現在 DEBUG CONSOLE
欄目下面。這樣我們就實現了遠程調試的,對於開源項目我們可以多使用單步調試去跟蹤代碼的執行,這樣可以更快了解程序的執行流程,當然遠程調試並不只是針對 Golang 項目,其他語言的也同樣適用。