对于大型的 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@hostnameVSCode 将打开一个新窗口,然后你会看到 "VSCode 服务器 "正在 SSH 主机上初始化的通知,一旦 VSCode 服务器安装在远程主机上,它就可以运行扩展并与你的本地 VSCode 实例通信了。通过查看状态栏中的指示器,可以知道已连接到虚拟机了,它显示的是你的虚拟机的主机名。
Remote-SSH 扩展还在你的活动栏上添加了一个新的图标,点击它将打开远程浏览器。从下拉菜单中,可以选择 SSH 目标,在这里你可以配置你的 SSH 连接。
一旦你连接到你的 SSH 主机,你就可以与远程机器上的文件进行交互l ,如果你打开集成终端(`⌃``),你会发现现在我们是在远程的 Linux 下面了。
"文件">"打开文件夹"端口转发环境配置
现在我们已经可以在 VSCode 中进行远程开发了,接下来我们以开源项目 KinD 为例来说明如何进行远程调试。
节点首先在远程主机上 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
Install on SSH: 192.168.31.104安装完成后,还需要安装一些相关的命令行工具,可以查看 https://github.com/golang/vscode-go 了解相关信息。同样在 VSCode 中输入 F1 按键,然后输入 Go 关键字,可以列出和 Go 相关的操作:
Go: Install/Update ToolsOKGOBIN这些命令行工具配置完成后,我们就可以在项目中使用这些工具了,在 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 中都有:
Cmd(Windows 下面是 Ctrl)+ F12远程调试
现在我们已经可以使用 Remote-SSH 插件开发项目了,但是在开发过程中或者学习开源项目的时候往往少不了调试,特别是要想快速了解开源项目的实现,单步调试跟踪代码是非常好的一种方式,比如我们要来跟踪下 KinD 是如何创建集群的,我们就可以在 KinD 创建集群的某些代码片段上打上端点,然后单步调试进行跟踪。
delve$ go get -u github.com/go-delve/delve/cmd/dlv
Debug: Open launch.jsonlaunch.json如果第一次打开,会新建一个配置文件,默认配置内容如下所示:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}",
"env": {},
"args": []
}
]
}
常见的配置属性:
我们还可以在配置文件中使用一些内置的变量:
${workspaceFolder}${file}${fileDirname}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开始调试后, delve 会在远程主机上启动一个无头服务,监听在 2345 端口上,正常这个时候我们的程序会运行到我们上面打的断点位置停下来:
F5:继续F10:单步执行F11:进入函数内部执行DEBUG CONSOLE