对于大型的 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 下面了。

"文件">"打开文件夹"
端口转发

环境配置

现在我们已经可以在 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 ToolsOK
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 中都有:

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