vscode 中未检测到 env 文件

Max*_*ess 5 go visual-studio-code

我有一个my-project多根工作区:

\n
- my-project\n   - my-project-api-gateway\n   - another-root-folder-we-dont-care-about\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的launch.json配置文件my-project-api-gateway

\n
- my-project\n   - my-project-api-gateway\n   - another-root-folder-we-dont-care-about\n
Run Code Online (Sandbox Code Playgroud)\n

调试控制台输出

\n
Starting: /Users/me/go/bin/dlv dap --check-go-version=false --listen=127.0.0.1:53890 --log-dest=3 from /Users/me/path/to/project/src\nDAP server listening at: 127.0.0.1:53890\nType \'dlv help\' for list of commands.\n2022/07/20 10:30:52 Error loading .env file\nProcess 13526 has exited with status 1\nDetaching\ndlv dap (13508) exited with code: 0\n
Run Code Online (Sandbox Code Playgroud)\n

感谢您的帮助

\n
\n

dlv、go、gopls 和 vscode 版本

\n
\xe2\x9d\xaf dlv version\nDelve Debugger\nVersion: 1.8.2\n\n\xe2\x9d\xaf go version\ngo version go1.18 darwin/amd64\n\n\xe2\x9d\xaf gopls -v version\nBuild info\n----------\ngolang.org/x/tools/gopls v0.9.1\n\n\xe2\x9d\xaf code -v\n1.69.2\n\n
Run Code Online (Sandbox Code Playgroud)\n

扩展Go for Visual Studio Code是 v0.35.1

\n

Go: Locate Configured Go Tools输出:

\n
Checking configured tools....\nGOBIN: /Users/me/go/bin\ntoolsGopath: \ngopath: /Users/me/dev/go\nGOROOT: /usr/local/go\nPATH: /usr/local/go/bin:/Users/me/.nvm/versions/node/v16.14.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Postgres.app/Contents/Versions/latest/bin:/Users/me/.cargo/bin:/Users/me/go/bin:/Applications/Postgres.app/Contents/Versions/latest/bin:/usr/local/cassandra/bin\nPATH (vscode launched with): /Users/me/.nvm/versions/node/v16.14.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/Applications/Postgres.app/Contents/Versions/latest/bin:/Users/me/.cargo/bin:/Users/me/go/bin:/Applications/Postgres.app/Contents/Versions/latest/bin:/usr/local/cassandra/bin\n\n    go: /usr/local/go/bin/go: go version go1.18 darwin/amd64\n\n    gotests:    /Users/me/go/bin/gotests    (version: v1.6.0 built with go: go1.18)\n    gomodifytags:   /Users/me/go/bin/gomodifytags   (version: v1.16.0 built with go: go1.18)\n    impl:   /Users/me/go/bin/impl   (version: v1.1.0 built with go: go1.18)\n    goplay: /Users/me/go/bin/goplay (version: v1.0.0 built with go: go1.18)\n    dlv:    /Users/me/go/bin/dlv    (version: v1.8.2 built with go: go1.18)\n    golangci-lint:  /Users/me/go/bin/golangci-lint  (version: v1.45.2 built with go: go1.18)\n    gopls:  /Users/me/go/bin/gopls  (version: v0.9.1 built with go: go1.18)\n\ngo env\nWorkspace Folder (my-project-api-gateway): /Users/me/dev/back/go/my-project/my-project-api-gateway\n    GO111MODULE=""\n    GOARCH="amd64"\n    GOBIN="/Users/me/go/bin"\n    GOCACHE="/Users/me/Library/Caches/go-build"\n    GOENV="/Users/me/Library/Application Support/go/env"\n    GOEXE=""\n    GOEXPERIMENT=""\n    GOFLAGS=""\n    GOHOSTARCH="amd64"\n    GOHOSTOS="darwin"\n    GOINSECURE=""\n    GOMODCACHE="/Users/me/dev/go/pkg/mod"\n    GONOPROXY="github.com/BigBoulard/*"\n    GONOSUMDB="github.com/BigBoulard/*"\n    GOOS="darwin"\n    GOPATH="/Users/me/dev/go"\n    GOPRIVATE="github.com/BigBoulard/*"\n    GOPROXY="https://proxy.golang.org,direct"\n    GOROOT="/usr/local/go"\n    GOSUMDB="sum.golang.org"\n    GOTMPDIR=""\n    GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"\n    GOVCS=""\n    GOVERSION="go1.18"\n    GCCGO="gccgo"\n    GOAMD64="v1"\n    AR="ar"\n    CC="clang"\n    CXX="clang++"\n    CGO_ENABLED="1"\n    GOMOD="/Users/me/dev/back/go/my-project/my-project-api-gateway/go.mod"\n    GOWORK=""\n    CGO_CFLAGS="-g -O2"\n    CGO_CPPFLAGS=""\n    CGO_CXXFLAGS="-g -O2"\n    CGO_FFLAGS="-g -O2"\n    CGO_LDFLAGS="-g -O2"\n    PKG_CONFIG="pkg-config"\n    GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/1g/fytltrn578gg3xgp3c_sglhw0000gq/T/go-build1439123167=/tmp/go-build -gno-record-gcc-switches -fno-common"\n
Run Code Online (Sandbox Code Playgroud)\n

Max*_*ess 5

这里的技巧是 my.env位于我的工作区文件夹下: ${workspaceFolder}/.env但是delve不用作${workspaceFolder}当前工作目录,这就是我用来从这里os.Getwd()获取的原因.env

load_eng.go摘录如下:

curDir, err := os.Getwd()
if err != nil {
    log.Println(err)
}
loadErr := godotenv.Load(curDir + "/.env")
if loadErr != nil {
  log.Fatalln("can't load env file from current directory: " + curDir)
}
Run Code Online (Sandbox Code Playgroud)

因此,我只需在文件中$cwd添加以下内容来设置当前工作目录:"cwd": "${workspaceFolder}"launch.json

"configurations": [
    {
      "name": "My Application",
      "type": "go",
      "request": "launch",
      "mode": "debug",
      "envFile": "${workspaceFolder}/.env",
      "program": "${workspaceFolder}/src/main.go",
      "cwd": "${workspaceFolder}"
    }
  ]
Run Code Online (Sandbox Code Playgroud)

有用的资源:

https://code.visualstudio.com/docs/editor/variables-reference#_predefined-variables

https://github.com/golang/vscode-go/wiki/debugging