不建议用 vscode 开发 go 的大项目。
远程 linux 环境是 wsl2-ubuntu20,原理上基本是一致。
习惯用 vscdoe 工作区统一配置设置和插件,再写一个同一个通用的 task、launch 模板,但是每个项目(文件夹)的 task 和 lauch 单独配置(因为不同项目 args、参数、环境要单独设置)。
- 远程机器。配置 go env,国内的网络建议配置
GOPROXY="https://goproxy.cn/,direct"
,不然后续下载 go tools 和包很慢。 - vscode 远程连接机器,安装 go 官方插件。安装 go 工具(vscode 中
ctrl + shift + p
搜索go install
) - 工作区设置。
"settings": { "go.inferGopath": false, // 用的是go mod(go>1.11),所以没有配置 "editor.tabSize": 4, "editor.insertSpaces": false, "go.docsTool": "godoc", // gopls下无影响 // "go.buildOnSave": "workspace", "editor.detectIndentation": false, "go.formatTool": "default", // gopls下不影响 "[go]": { "editor.insertSpaces": false, "editor.tabSize": 4, "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": true // 保存时自动import }, "editor.suggest.snippetsPreventQuickSuggestions": false }, "go.toolsManagement.checkForUpdates": "proxy", // 提示go或go tools的版本更新,我配置了goproxy "go.useLanguageServer": true, "go.languageServerFlags": [ "-rpc.trace", // for more detailed debug logging ], "gopls": { "ui.completion.usePlaceholders": false, // "usePlaceholders": true, // add parameter placeholders when completing a function "completeUnimported": true, // autocomplete unimported packages "deepCompletion": true, // enable deep completion }, "terminal.explorerKind": "integrated", },
目前 gopls 已经稳定了,内存占用差不多 300M 以内。
➜ procs gopls PID:▲ PPID │ User │ CPU VmRSS │ TCP │ Command │ │ [%] [bytes] │ │ 4439 4228 │ bingo │ 0.0 210.832M │ [] │ ${GOPATH}/bin/gopls -mode=stdio -rpc.trace
-
准备 task 和 launch 模板,参考了官方文档
-
task.json
{ "version": "2.0.0", "cwd": "${workspaceFolder}", "tasks": [ { // 最终的编译 "label": "linux : go build", "command": "go", "args": [ "build", "-o", "bin/${workspaceFolderBasename}", // 编译对应的目录 ], "group": { "kind": "build", } }, { // 调试的编译 "label": "linux : go build(debug)", "type": "shell", "command": "go", "args": [ "build", "-gcflags=all=-N -l", // -N 禁用优化 -l 禁用内联 "-o", "bin/__debug_${workspaceFolderBasename}", ], "group": "build", }, { "label": "linux : go test(debug)", "type": "shell", "command": "go", "args": [ "test", "-c", "-o", "bin/__test_${workspaceFolderBasename}", ], "group": "test", }, { // 远程终端内调试和相关的后面launch.json中要求一致 // 如果是root用户可以不用sudo "label": "dlv start", "type": "shell", "command": "sudo", "args": [ "dlv", "dap", "--listen=127.0.0.1:12345", "--log-dest=3", "--only-same-user=false" ], "group": "build" } ], }
-
launch.json
Launch: fastDebug,使用用默认的调试控制台,缺点是不能输入,不过 F5 运行是非常的方便。剩下两个是当程序要模拟终端输入时,先
ctrl + shift +b
运行 task 中 dlv dap 服务器。
对于已运行的 go 程序,可以用 attach 模式。{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 // 远程调试前必须先启动dlv // sudo dlv dap --listen=127.0.0.1:12345 --log-dest=3 --only-same-user=false "version": "0.2.0", "configurations": [ { "name": "goDebug", "type": "go", "debugAdapter": "dlv-dap", "preLaunchTask": "linux : go build(debug)", // 预先调用编译 "request": "launch", "mode": "exec", "asRoot": true, // 以root用户执行 "port": 12345, "host": "127.0.0.1", "program": "bin/__debug_${workspaceFolderBasename}", "cwd": "${workspaceFolder}", "env": { "GO111MODULE": "auto" // 使用go mod }, "args": [], }, { "name": "goTest", "type": "go", "debugAdapter": "dlv-dap", "request": "launch", "preLaunchTask": "linux : go test(debug)", // 语调调用编译 "mode": "exec", "asRoot": true, "port": 12345, "host": "127.0.0.1", "program": "bin/__test_${workspaceFolderBasename}", "cwd": "${workspaceFolder}", "env": { "GO111MODULE": "auto" }, "args": [], }, { "name": "fastDebug", "type": "go", "debugAdapter": "dlv-dap", "request": "launch", "mode": "debug", "asRoot": true, // 以root用户执行 "program": "${workspaceFolder}", "cwd": "${workspaceFolder}", "env": { "GO111MODULE": "auto" }, "args": [], } ] }
-
-
在 go 工作区中添加项目(文件夹),将 task 和 launch 模板拷贝到项目下的
.vscode
目录下,然后就是用 go mod init 初始化项目了。(go mod 相关的操作其实也可以考虑配置成 task)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于