原因
在使用VSCode 进行golang开发学习时,在创建多个go mod 之后就会报错,查看定义、自动引用补全的功能无法使用。 golang 项目结构:
.
├── go.mod
|── main.go
├── a
│ ├── a.go
│ └── go.mod
└── b
├── b.go
└── go.mod
VSCode 报错:
Error loading workspace: You are working in a nested module. Please open it as a separate workspace folder. Learn more: https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
解决
根据报错提示解决方法如下:
- 每个 go module 创建一个工作区,也就是 VSCode多工作区模式 。在根目录下创建一个
*.code-workspace
的json格式文件将不同的go module划分到不同的workspace,实例如下:
// myproject.code-workspace
{
"folders": [
{
"name": "myproject"
},
{
"name": "mod-a",
"path": "./a"
},
{
"name": "mod-b",
"path": "./b"
}
],
"settings": {}
}
这种方法未作验证,仅供参考
- gopls 实验性工作区多模块
golps 支持单个 workspace 使用多个模块,这个功能叫做“工作区模块”,需要编辑VSCode settings.json
配置gopls来开启。我采用的是这种方法,只要设置VSCode就行了。
"gopls": {
"build.experimentalWorkspaceModule": true,
"ui.completion.usePlaceholders": true
}
- GOPATH 模式
直接使用VSCode 打开整个GOPATH,将整个GOPATH 当作一个 workspace,这样带来的问题就是gopls会很慢,gopls会寻找和加载所有GOPATH 的 go文件。
参考
- gopls 工作区设置: https://github.com/golang/tools/blob/master/gopls/doc/workspace.md
- vscode 多工作区: https://code.visualstudio.com/docs/editor/multi-root-workspaces
- Golang小技巧-在单个仓库中支持多个 go mod 模块: https://www.robberphex.com/golang-multi-module-project-vscode-config/