VSCodeにおけるGoのモジュール周りのエラー
参考書の写経やハンズオンイベントでのコード管理で、たまに出会います。
gopls was not able to find modules in your workspace.
When outside of GOPATH, gopls needs to know which modules you are working on.
You can fix this by opening your workspace to a folder inside a Go module, or
by using a go.work file to specify multiple modules.
See the documentation for more information on setting up your workspace:
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
このエラーにたまに出会うので、対処法をまとめておきます。
環境
- macOS Ventura 13.5
- VSCode バージョン: 1.81.1
- go version go1.20.7 darwin/amd64
サンプルのディレクトリ構成
上の画像で package main
に赤線が引かれた状態のディレクトリ構成は以下です。
.
├── sample1
│ ├── go.mod
│ └── main.go <-------- ここのpackage mainでエラー
└── sample2
├── go.mod
└── main.go <-------- ここのpackage mainでエラー
対処
エラーを読むと、
using a go.work file to specify multiple modules.
とありました。go.work
を使えばいいみたいです。
go.workとは
go 1.18から追加されたWorkspace modeと呼ばれるものです。複数モジュールを管理しやすくするものです。(ざっくり)
go.work
を作る
$ go work init
or
$ go work init
$ go work use ./sample1 ./sample2
or
$ go work init ./sample1 ./sample2
でできます。
go mod
に少し似てますね。
作った後のディレクトリ構成としては、
.
├── go.work
├── sample1
│ ├── go.mod
│ └── main.go
└── sample2
├── go.mod
└── main.go
注意する点
go.work
はルートディレクトリに作らないといけない
- 今回だと、sample1やsample2の上に作らないといけないです。
go.work
内のuseに注意
- 開いているフォルダが
go.work
のuseに指定されていない時、という文とともにpackage mainに黄色波線が引かれます。This file is within module "sample1/sample1-1", which is not included in your workspace. To fix this problem, you can add this module to your go.work file (/Users/itoushingo/workplace/Practice_golang/test/go.work) See the documentation for more information on setting up your workspace: https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.
新しくフォルダを作って実装を始めたら、go work use
で追加します。 - モジュール名が被ってると、
というエラーが出ます。
packages.Load error: err: exit status 1: stderr: go: module モジュール名 appears multiple times in workspace.
go mod init
の時に指定するモジュール名が被らないよう注意します。
VSCodeのsetting.jsonについて
setting.jsonに
{
"gopls": {
"experimentalWorkspaceModule": true
}
}
を記述すると、私の環境では
Invalid settings: gopls setting "experimentalWorkspaceModule" is deprecated
となり、非推奨になったみたいです。
おわりに
今後気になったら随時追加修正していきます。