こんにちは。
フロントエンドエンジニアでバックエンドも頑張りたいみつです
GoをVS Codeで書いているのですが、直接的な問題もなく見て見ぬふりをしていた下記のエラー。
could not import XXX (cannot find package "XXX" in GOROOT or GOPATH)
赤い線が多すぎてついに、VS Codeでエラータブでエラー数が10kに到達したのでそろそろやばいでしょ...という焦りと何が起きていたんだろうを記事にしたものです。
ちなみに、自分の場合は、Goのインストールも出来ているのと、ターミナルでGoを認識もしていたので、go.modファイルがあるディレクトリでワークスペースを開くだけでエラーの文言は消えました。
目次
- 最近起きてた嫌なこと
- BrokenImportってなんだろう?
- GOROOTとかGOPATHってなんだろう?
- 「Using Go Modules」ドキュメントを読む
- VS Codeのエラーに対応する。
- まとめ
最近起きてた嫌なこと
terminalでgo version
コマンドを叩くと、Goを認識する。
ただ、エディタ画面や問題のタブにはBrokenImportの大量エラーが発生している。
BrokenImportってなんだろう?
// BrokenImport occurs when importing a package fails.
//
// Example:
// import "amissingpackage"
BrokenImport
BrokenImportは、ファイルインポートに失敗した時に起きる。
うん、それはそう。
ImportがBrokenしているみたい。
GOROOTとかGOPATHってなんだろう?
could not import XXX (cannot find package "XXX" in GOROOT or GOPATH)
GOROOT は、Go SDK の場所を定義する変数です。
異なる Go バージョンを使用する予定がない限り、この変数を変更する必要はありません。
GOPATH は、ワークスペースのルートを定義する変数です。
GoLandドキュメントによると、GOROOTはGo SDKの場所を定義する変数。
GOPATHは、ワークスペースのルートを定義する変数。
envを見ると、GOPATHもGOROOTも設定されるね。よしよし。
> go env
・・・
GOPATH='/Users/okada.mitsuhiro/go'
GOROOT='/opt/homebrew/Cellar/go/1.21.4/libexec'
・・・
自分の場合、異なるGoバージョンを使用することはあまりなさそうなので、GOPATHが認識されずにBrokenImportを起こしているのかなというところです。
「Using Go Modules」ドキュメントを読む
なるほどなと思ったところだけをピックしてみます。
A module is a collection of Go packages stored in a file tree with a go.mod file at its root.
モジュールは、ファイルツリー内のGoのパッケージ群。
As of Go 1.11, the go command enables the use of modules when the current directory or any parent directory has a go.mod, provided the directory is outside $GOPATH/src.
go commandのモジュールが有効になるのは、カレントディレクトリか親ディレクトリにgo.modがあるのと、$GOPATH/srcの外であることが条件。
[公式ドキュメント]
VS Codeのエラーに対応する。
特に何をした、というわけではないんですが・・・
go.modがあるディレクトリに移ることで、モジュールモードが有効になってPATHが認識されたという感じでした。
まとめ
一番上の階層から開いて大量に赤文字のエラーが出てただけ。
でもエラーを通して、GOPATHやGOROOT、go.modなどへの理解が深められたのが嬉しいなと思います。
ただ、10kもエラーの個数が出てくるまで放置していたのもやばいなと思うのでもっと早くからエラー調査する癖をつけようと思います。
おわり。