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,不要了,要了會又衝突,造成錯誤。
檢查當前vscode工程的GOPATH路徑的命令 -》vscode 菜單 view -> command palette -> GO:current GOPATH