WEB

【Go】Error loading workspace: packages.Load error: err: exit status 1: stderr: go: no modules were found in the current workspace; see ‘go help work’の対処法【gopls】

WEB
この記事は約7分で読めます。

はじめに

株式会社インプルの奈良です。

今回の記事は、Goの環境構築時のかなり局所的なエラー解決の記事になりますが、現時点でStack Overflowに1件、GitHubに2件、その他の記事に数件しか該当エラーがないため、これからGoを学習する誰かの助けになればと思い記事を残します。

エラーが出るまでの状況

なら
なら

Goの学習開始!まずはGoをインストールしてVScodeでGoInstall/Update tools を実行しGoツールの更新を行うっと・・・

なら
なら

全部チェックしてOK押して・・・

なら
なら

全部インストールできた!早速学習開始!

Ude●yのカリキュラムによると、fと打てばfmtと表示されて、import文が自動補完されるんだね!

なら
なら

でねぇ・・・

エラー文との遭遇

なら
なら

他のgoツールの機能は利用できているし、go.modも作成しているし、pathもしっかりと通したのに何が原因だ?というかvscodeに下に何かでてる・・・・

Error loading workspace: packages.Load error: err: exit status 1: stderr: go: no modules were found in the current workspace; see 'go help work'
なら
なら

なんだこれ???教えてChatGPT!

ChatGPTの回答

Error loading workspace: packages.Load error: err: exit status 1: stderr: go: no modules were found in the current workspace; see ‘go help work’」というエラーメッセージは、gopls(Go言語サーバー)が現在のワークスペースにGoモジュールを検出できていないことを示しています。これは自動インポート機能に影響を与える可能性があります。

この問題を解決するために以下の手順を試してください:

  1. Goモジュールの存在確認:
    • 現在のワークスペース(プロジェクトのディレクトリ)内にgo.modファイルが存在するか確認します。go.modファイルはGoモジュールの存在を示す重要なファイルです。
  2. Goモジュールの初期化:
    • もしgo.modファイルが存在しない場合は、プロジェクトのルートディレクトリでgo mod init [モジュール名]コマンドを実行して新しいモジュールを作成します。[モジュール名]は通常、プロジェクトのリポジトリURL(例:github.com/username/projectname)ですが、ローカルプロジェクトの場合は任意の名前を使用できます。
  3. VS Codeのワークスペース設定を確認:
    • VS Codeが適切なディレクトリ(Goモジュールの存在するディレクトリ)をワークスペースとして認識しているかを確認します。
  4. VS Codeの再起動:
    • VS Codeを再起動して、goplsが新しいモジュール設定を認識するようにします。

これにより、goplsがワークスペース内のモジュールを正しく検出し、自動インポート機能が適切に動作するようになるはずです。もし問題が解決しない場合は、VS CodeのGo言語の拡張機能やgoplsの設定にさらに注意を払う必要があります。また、go help workコマンドを実行して、ワークスペースに関する追加の情報を得ることも有効です。

なら
なら

goplsが正しく動作していないから、エラーがでているんだね。

あーなるほど、そういうことね。完全に理解した。解決余裕じゃん。

【補足】goplsとは

<span class="bold-red">gopls</span>(発音は「go please」)は、Goプログラミング言語用の言語サーバーです。このツールは、Language Server Protocol (LSP)に準拠しており、Goのコードを編集する際にIDEやエディタが提供する多くの便利な機能をバックエンドでサポートしています。

goplsの主な機能

  1. コード補完: コードの記述中に関数名、変数、その他の識別子の提案を表示します。
  2. 定義へのジャンプ: 関数や変数の定義箇所へ簡単にナビゲートできます。
  3. リファクタリング: リネームやコード構造の変更などのリファクタリングをサポートします。
  4. エラー検出: コードのシンタックスエラーや型の不一致などをリアルタイムで検出します。
  5. ドキュメントの表示: 関数やパッケージのドキュメントをエディタ内で簡単に閲覧できます。
  6. 依存関係の管理: go.mod ファイルを介した依存関係の管理と整理をサポートします。

goplsの利点

  • 効率的な開発: goplsを利用することで、Goの開発効率が向上します。コードのエラーを早期に発見し、迅速な修正が可能になります。
  • IDE/エディタの統合: Visual Studio Code, Vim, Emacsなど、多くの主要なテキストエディタやIDEと統合できます。
  • 標準化されたプロトコル: LSPに準拠しているため、多様な開発環境で一貫した体験を提供します。

ChatGPTの回答全てを試した結果

なら
なら

ChatGPTの回答を全て試しましたが解決せず・・・加えて下記のサイトを参考にしても解決に至らず・・・詰んだかこれ

Error loading workspace: err: exit status 1: stderr: go: updates to go.sum needed, disabled by -mod=readonly : packages.Load error
I am using VSCode and vscode-go to develop the Go application,but, sometime, I got this error, and can't jump to the code definination How can I get past this e...
Error loading workspace: err: exit status 1: stderr: go: inconsistent vendoring in /tmp/gopls-workspace-mod904073450 · Issue #2112 · golang/vscode-go
I use the go1.18. I want to view the source code of kubernetes in vscode. But when I open a go file, it always prompts me the following error, Error loading wor...
gopls: automated issue report (crash) · Issue #2145 · golang/vscode-go
gopls version: v0.8.1 (go1.18) gopls flags: update flags: proxy extension version: 0.32.0 go version: 1.18 environment: Visual Studio Code linux initialization ...
【Go】エディタを開くたびにError loading workspace folders (expected 1, got 0)と出る
### 前提・実現したいこと golangでspaを作っている際、プロジェクトをエディタで開くたびに```Error loading workspace folders (expected 1,

原因と解決

上記サイトの手順や、goツールなどの拡張機能の入れ直し、pathの見直し、vscodeやターミナルの再起動をしても解決せず・・・ふと、プロジェクト構成を見直してみると・・・

なら
なら

そういえばgo.workってファイル、環境構築の記事をみてgo work initコマンドでよくわからずに作ったような。エラーでモジュール関連のこと言われたし消してみるか・・・

👏🎉💃出来た!!!🕺🎉👏

go.workの解説とエラー解消ができた理由考察

go.workファイルは、Go言語の開発ツールであるgoplsによって使用される、比較的新しい機能の一部です。このファイルは、複数のGoモジュールを含むワークスペースを定義するために使用されます。go.workファイルを使用すると、開発者は複数の関連するGoモジュールを同時に扱いやすくなります。

具体的には、go.workファイルは以下のような場合に有用です:

  1. 複数のモジュールを一緒に開発する場合:
    • 複数の関連するGoモジュールがあり、それらを同時に編集したい場合に役立ちます。例えば、あるライブラリとそれを使用するアプリケーションの両方を同時に開発している場合などです。
  2. 依存関係の管理:
    • go.workファイルを使用すると、ワークスペース内のモジュール間で依存関係を共有し、統一的なビルド環境を提供することができます。
  3. 大規模なプロジェクト:
    • 複数のチームやサブプロジェクトで構成される大規模なプロジェクトでは、go.workファイルを使用して、モジュール間の連携をスムーズに行うことができます。

go.workファイルの存在により、goplsやその他のGoのツールは、ワークスペース内のすべてのモジュールを統合して扱います。

ただし、このファイルの管理が不適切だと、予期しないビルドの問題や依存関係の問題が発生することがあります。そのため、go.workファイルの使用は、複数のモジュールを扱う複雑なプロジェクトでのみ推奨されます。

go.workファイルを削除すると、各モジュールはそれぞれ独立して扱われるようになり、単一モジュールプロジェクトでの開発が簡素化されます。これが問題を解決したということは、おそらくワークスペースの設定がプロジェクトの要件に適合していなかった可能性があります。

まとめ

今回のエラーの原因は結論として、go.workファイルを作成していたことにより、goplsがワークスペース内で不適切な依存関係に設定されていたことが原因だったと考えられます。

初めての言語の環境構築時は、訳のわからないエラーに遭遇して挫折しそうになることがありますが、作業フローに整合性があるかを一つずつ紐解いていけば必ず解決できるため、根気強くチャレンジしていきましょう!!!