M$推出vscode之后,感觉世界真美好。于是从liteide转到vscode了。但是golang组织代码的目录管理这尿性比较奇葩。常常把自己搞得五迷三道的。有时候正常,有时候又掉链子。现在记录一下一些注意事项。
windows下的vscode,首先安装golang到 c:/Go 也就是环境变量GOROOT=c:/Go,然后指定GOPATH=c:/Go/gopath 这个目录自己建立。环境变量里面GOROOT和GOPATH只留下系统变量,用户变量中的GOROOT,GOPATH删除。不然鬼知道会搞出神马冲突,不划算,环境变量设置好之后,一定要重新自动下电脑,不然有时候vscode读不到最新环境变量设置。之所以GOPATH指定一个专用目录,而不是用户目录(类似 C:\Users\Administrator\go),主要因为项目如果发布到git,自己在多台电脑上编译代码的话。比较麻烦所以统一指定固定目录。
然后vscode安装微软的ms-vscode.go插件。穿好后用workspace来组织golang代码。
目录结构大致如下:
G:\DEVTOOLS\project\git\MonsterLive\WebSocketServerGo\MonsterShowMain>dir
驱动器 G 中的卷没有标签。
卷的序列号是 CC73-754C
G:\DEVTOOLS\project\git\MonsterLive\WebSocketServerGo\MonsterShowMain 的目录
2019/07/25 09:12 <DIR> .
2019/07/25 09:12 <DIR> ..
2019/07/25 09:02 <DIR> .vscode
2019/07/25 09:12 982 MonsterShowMain.code-workspace
2019/07/25 09:02 <DIR> src
1 个文件 982 字节
4 个目录 4,248,682,496 可用字节
.vscode是vscode的配置文件所在目录。MonsterShowMain.code-workspace文件是vscode的workspace文件。里面可以设置本工程的一些环境变量。其内容大致如下:
{
"folders": [
{
"path": "."
}
],
"settings": {
"go.inferGopath": true,
"go.buildOnSave": "workspace",
"go.lintOnSave": "package",
"go.vetOnSave": "package",
"go.buildTags": "",
"go.buildFlags": [],
"go.lintFlags": [],
"go.vetFlags": [],
"go.coverOnSave": false,
"go.useCodeSnippetsOnFunctionSuggest": false,
"go.formatTool": "goreturns",
"go.goroot": "C:/Go/",
"go.gopath": "C:/Go/gopath/go/",
"go.toolsGopath":"C:/Go/gopath/go/",
"go.gocodeAutoBuild": false,
"go.useLanguageServer": true,
"go.alternateTools": {
"go-langserver": "gopls",
},
"go.languageServerExperimentalFeatures": {
"format": true,
"autoComplete": true
},
"[go]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
}
}
}
其中的:
"go.inferGopath": true,
"go.goroot": "C:/Go/",
"go.gopath": "C:/Go/gopath/go/",
"go.toolsGopath":"C:/Go/gopath/go/",
这四行相当重要。vscode的调试菜单启动时读取的是windows系统的环境变量中的GOPATH, 而项目中的编译,智能提示,可以用上面四行设置中的路径覆盖环境变量。
其中 go.toolsGopath 也设置上比较好。不然会在本地项目中创建bin目录,麻烦。指定一个固定位置,多个项目可以共享这些工具。这些工具就是
Installing 12 tools at C:/Go/gopath/go/\bin
gocode
gopkgs
go-outline
go-symbols
guru
gorename
dlv
gocode-gomod
godef
goreturns
golint
gopls
Installing github.com/mdempsky/gocode SUCCEEDED
Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline SUCCEEDED
Installing github.com/acroca/go-symbols SUCCEEDED
Installing golang.org/x/tools/cmd/guru SUCCEEDED
Installing golang.org/x/tools/cmd/gorename SUCCEEDED
Installing github.com/go-delve/delve/cmd/dlv SUCCEEDED
Installing github.com/stamblerre/gocode SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing github.com/sqs/goreturns SUCCEEDED
Installing golang.org/x/lint/golint FAILED
这些鸟东西。
"go.inferGopath": true 的作用是把本地项目的src也包含到gopath中,但是不污染全局gopath,大概就是这个意思。
然后.vscode目录下面有个launch.json,如下:
G:\DEVTOOLS\project\git\MonsterLive\WebSocketServerGo\MonsterShowMain\.vscode>dir
驱动器 G 中的卷没有标签。
卷的序列号是 CC73-754C
G:\DEVTOOLS\project\git\MonsterLive\WebSocketServerGo\MonsterShowMain\.vscode 的目录
2019/07/25 09:02 <DIR> .
2019/07/25 09:02 <DIR> ..
2019/07/25 09:02 626 launch.json
1 个文件 626 字节
2 个目录 4,248,682,496 可用字节
G:\DEVTOOLS\project\git\MonsterLive\WebSocketServerGo\MonsterShowMain\.vscode>
这个文件的主要作用是让vscode的调试和运行菜单关联到运行的代码,其内容如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。src\Pic98\main.go
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceRoot}/src/main.go",
"env": {
//"GOPATH":"C:/Go/gopath/go/",
//"GOROOT":"C:/Go/",
},
"args": []
}
]
}
其中 program 就是指定你要自动的主程序源代码。
env里面的GOPATH,GOROOT,不要了,要了会又冲突,造成错误。
有疑问加站长微信联系(非本文作者)