質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

294閲覧

GOROOTの適切な設定

aaaa____

総合スコア29

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

1グッド

0クリップ

投稿2024/06/10 12:16

編集2024/06/13 12:18

実現したいこと

フォルダVPMから外部コマンドによってmain.goを実行するために以下のコマンドで実行したい

go run ./PM/01/src/PM/main.go

ファイル構成

/Users/username/M1/RP/VPM/ ├── .envrc ├── srever.js └── PM/01/ └── src/PM/ ├── go.mod ├── main.go └── repl/ └── repl.go

main.goのすぐ上にあるPMでgo run main.goを実行する分には問題なく行えています.

環境

  • MacBook Air M2
  • Ventura 13.5

発生している問題・エラーメッセージ

PM/01/src/PM/main.go:6:2: package PM/repl is not in GOROOT (/usr/local/go/src/PM/repl)

direnvが通るようですが,実行はできませんでした.

RP % cd VisualPMusic direnv: loading ~/M1/RP/VisualPMusic/.envrc direnv: export ~GOPATH

main.go

Go

1package main 2 3import( 4 "fmt" 5 "os" 6 "PM/repl" 7) 8 9func main(){ 10 output, _ := os.Create("../../../../docs/melody.txt") 11 output.Close() 12 fmt.Printf("Feel free to type in commands\n") 13 repl.Start(os.Stdin, os.Stdout) 14}

疑問点

GOROOTはGoのVer.を管理するために設定するという認識であり,いくつか記事を見てみたところ,GOROOTは明示的に設定しなくてよいというように書いてあったりするのですが,なぜここがネックになってエラーが起きるのかがわかりません.
参考記事

PMフォルダでもVPMフォルダでもgo envで見えるGOROOTは同じなのに,PMではnot in GOROOTとなってしまうのは相対パス関連の話だと思うのですが,どこをどう変えれば良いのか模索中です.

https://qiita.com/momotaro98/items/23fa4356389a7e610acc
この記事で言うところの絶対パスとは,どういうものなのでしょうか.go.modの場所(module名)からのパス,相対パスのように見えてしまうのですが.

試したこと

VPMでの go env の結果

@MacBook-Air-2 VPM % go env GO111MODULE="" GOARCH="arm64" GOBIN="" GOCACHE="/Users/username/Library/Caches/go-build" GOENV="/Users/username/Library/Application Support/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="arm64" GOHOSTOS="darwin" GOINSECURE="" GOMODCACHE="/Users/username/go/monkey/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="darwin" GOPATH="/Users/username/M1/RP/VPM" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_arm64" GOVCS="" GOVERSION="go1.18.3" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/d9/bmytbwsn2yjdxh_zrh3b9z380000gn/T/go-build2240308372=/tmp/go-build -gno-record-gcc-switches -fno-common"

go.mod

module PM go 1.18 require ( github.com/faiface/beep v1.1.0 // indirect github.com/hajimehoshi/go-mp3 v0.3.0 // indirect github.com/hajimehoshi/oto v0.7.1 // indirect github.com/pkg/errors v0.9.1 // indirect golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8 // indirect golang.org/x/image v0.0.0-20190227222117-0694c2d4d067 // indirect golang.org/x/mobile v0.0.0-20190415191353-3e0bab5405d6 // indirect golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 // indirect )

envrc

export GOPATH=$(pwd)

以下も試してみましたが結果は変わらずでした.

export GOPATH="/Users/username/M1/RP/VPM/PM/01"

見た記事

https://zenn.dev/tennashi/articles/3b87a8d924bc9c43573e
このサイトを読めばGOPATH関係なく開発できそうなのでやってみて次のようにしましたが,依然だめでした.

~ % go env GO111MODULE="on" GOARCH="arm64" GOBIN="/bin" GOCACHE="/Users/username/Library/Caches/go-build" GOENV="/Users/username/Library/Application Support/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="arm64" GOHOSTOS="darwin" GOINSECURE="" GOMODCACHE="/Users/username/go/monkey/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="darwin" GOPATH="/Users/username/go/monkey" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_arm64" GOVCS="" GOVERSION="go1.18.3" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/d9/bmytbwsn2yjdxh_zrh3b9z380000gn/T/go-build3815054543=/tmp/go-build -gno-record-gcc-switches -fno-common"

https://qiita.com/AQUA651/items/d1c3a3b1d339ca0a0b41
この記事を読みましたが,この記事におけるmain.goimportのルートパスの仕組みがよくわかりませんでした.

melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2024/06/13 01:39

なかなか回答やコメントが付かないようでしたので: > PM/01/src/PM/main.go:6:2: package PM/repl is not in GOROOT (/usr/local/go/src/PM/repl) これはGOROOTの問題とかではなく、main.goが何らかのかたち(package?)で参照していると考えられるPM/repl/repl.goが見付からないというメッセージだと思いますよ。 > GOROOTはGoのVer.を管理するために設定するという認識であり, Goのバージョンを管理する為というより、今利用しているGoの環境のルートを示すことが主体で、それが結局、複数のバージョンのGoを使い分けの管理ができることになる、と言うことのはずです。 main.go のコードは実際、どうなっているのでしょう。
aaaa____

2024/06/13 02:06

コメントいただきありがとうございます. repl.goが見つからないのは,コマンドを実行する場所が変更されたことによってmain.goにおけるimportのパスが適したものでなくなってしまうということなのでしょうか. GOROOTの認識についての補足もありがとうございます. main.goの内容も質問本文に追記させていただきました. 何卒よろしくお願いいたします.
melian

2024/06/13 14:43 編集

Tutorial: Getting started with multi-module workspaces - The Go Programming Language https://go.dev/doc/tutorial/workspaces Go workspaces を利用してみてはどうでしょうか。具体的には以下を実行します。 cd /Users/username/M1/RP/VPM/ go work init ./PM/01/src/PM go run ./PM/01/src/PM/main.go # もしくは以下でも可 # go run ./PM/01/src/PM
aaaa____

2024/06/14 12:02

教えていただいたGo workspacesによって問題を解決することができました. ベストアンサーとさせていただきたいのですが,回答としてつけていただくことは可能でしょうか. 何卒よろしくお願いいたします.
guest

回答1

0

ベストアンサー

※ コメントから転記

Go workspaces を利用してみてはどうでしょうか。

Tutorial: Getting started with multi-module workspaces - The Go Programming Language

具体的には以下を実行します。

bash

1$ cd /Users/username/M1/RP/VPM/ 2$ go work init ./PM/01/src/PM 3$ go run ./PM/01/src/PM/main.go 4# もしくは以下でも可 5# go run ./PM/01/src/PM

投稿2024/06/14 12:11

melian

総合スコア20255

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaa____

2024/06/14 12:34

回答ありがとうございます 問題が解決しましたので,ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問