実現したいこと
フォルダ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.go
のimport
のルートパスの仕組みがよくわかりませんでした.
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー