shunsa10
@shunsa10 (shun sato)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

reactとgoのファイル構造について

現在ポートフォリオとしてフロントにreact、バックエンドにgoを使用しています。
今まで別々で学んできたのでreactとgoを兼ね合わせるのは初めてです。
質問したい内容は以下の二つです。

1.ファイル構造は画像の通りで問題ないか。
2.エラーの解決(エラー内容は下に記述します)

現在のファイル構造image

1.ファイル構造は画像の通りで問題ないか。
index.tsxがあるsrcと同じ層にbookputGoフォルダを作り,bookputGo直下にmain.goを置きました。

2.エラーの解決(エラー内容は下に記述します)
gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon, and you can learn more here:
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.go list

image

$go mod init github.com/shunsa10/bookput
$go mod tidy
go.mod作成後同じ層にmain.goを作成。
package mainでエラー発生。

試したこと

setting.jsonに

`"gopls": {
"experimentalWorkspaceModule": true,
},`

を追加し"editor.fontLigatures": "null",をbooleanに変更。

エラーは変わらず。
しかし同じファイル構造で、creat react appしただけのファイルではエラーは起きませんでした。
お力添えいただけたら光栄です。よろしくお願いします。したことを記載してください。

0

1Answer

エラー内容

gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon, and you can learn more here:
https://github.com/golang/tools/blob/master/gopls/doc/workspace.md.go list

gopls が吐き出している上記エラーは、2 つの内容に分かれています。

  1. gopls requires ... of your workspace.
    • 「プロジェクトのルート・ディレクトリに go.mod が存在しないため、必要なパッケージが検証できない」という意味
  2. You can work with multiple ... go list

今回は、モノリシックなプロジェクトではない(複数の異なるプロジェクトを 1 つのリポジトリで管理するタイプではない)ので、前者のエラー内容が該当します。

原因

gopls./bookputGo/ に Go(以下 golang)のコード(main.go)を見つけるも、パッケージ情報(go.modgo.sum)がプロジェクトのルートにないため、コードを解析する際に必要なモジュールが事前に読み込めずエラーを表示します。

しかし、サブ・ディレクトリに ./bookputGo/go.mod を見つけたため、マルチ・モジュールかもしれないと、二つ目のエラーを表示しています。

対策

bookputGo/go.mod を一階層上のプロジェクトのルートに設置・移動する必要があります。

理由

gopls静的解析ツール(プログラムをコンパイルせずに、ソースコードを構文解析するタイプ)なので、あらかじめプロジェクトが必要とするパッケージやモジュールを定義したファイル(go.mod もしくは go.work)をプロジェクト・ルートに置いておく必要があります。

つまり、main.go と同じ階層で go mod init ... をせずに、プロジェクトのルート(yarn.lock などと同じ階層)で go mod init github.com/shunsa10/bookput を実行します。

そして go mod tidy すると、サブ・ディレクトリを含むディレクトリをスキャンして、各々のパッケージで import されているモジュールを見つけると go.mod に追記し、その時点のモジュールのバージョンを go.sum に記録します。

go.mod は Node.js でいう package.json と同じ役割をするものです。つまり、そのプロジェクトで利用されるモジュールを定義したファイルです。

そして、go.sumyarn.lock と同じで、動作確認が取れているモジュール/パッケージのバージョンが記載されたものです。

モジュールとパッケージ

わかりづらいのですが、golang において、他の言語(例えば PHP や Java など)でいうモジュールとパッケージの概念が、最初のうちは感覚的に逆になります(Go に慣れてくると同じものだと気づくのですが)。

  • パッケージとは: 1 つのディレクトリに収まっている Go コードのこと
  • モジュールとは: 上記パッケージを 1 つにまとめたもの(go.mod 以下にある package ファイル)

特に、main.go のトップには package main と書くものだから、「main パッケージが必要とするモジュールは同じ階層に go.mod として置く」と思い込みがちです。

しかし、go.mod は「そのプロジェクトが必要とするモジュールを定義しているもの」です。

つまり、go get ... で利用できるライブラリのような main.go が存在しないプロジェクトであっても go.mod は存在します。

そのため、golang においては、「パッケージとは、モジュールとして利用できる単位(package main を除く)」と考えるといいかもしれません。

0Like

Your answer might help someone💌