#経緯
実行環境はMac
です。
Go環境を構築時、$GOPATHを明示的に指定せず
構築してからプログラムを書き、実行していた。
外部パッケージをgo get
で取得してプログラム内でインポートする必要が出てきた。
go get
自体は実行だけなら問題なく出来たものの、その後go run foo.go
がエラーで通らなくなった。
エラー内容で案内された通りのコマンド叩いても、反応無し
。
※warning
については後述
human$ go run foo.go
warning: GOPATH set to GOROOT (/usr/local/opt/go/libexec) has no effect
go: inconsistent vendoring in /usr/local/opt/go/libexec/src:
go.mod requires github.com/stretchr/testify v1.4.0 but vendor/modules.txt does not include it.
run 'go mod tidy; go mod vendor' to sync
$GOPATH
と$GOROOT
を設定して、再度go run
→ 失敗
go get
を再実行しても、最新だよ
と怒られる。
困った
。
#結論
$GOPATH
と$GOROOT
を適当に理解し、途中でイジイジしたせいでディレクトリ構造がイカれた。
修正の対応として、以下を実施
1. $GOPATHを設定&反映
2. エラー内容で案内されたコマンドを再度叩く
3. 100回目のgo run xxx.go
再実行 → 成功
#もう少し詳しく
そもそも、筆者は$GOPATH
と$GOROOT
をあまり理解していなかった。
簡単な違いを以下に示します。
$GOPATH
:
Goのワーキングディレクトリを指す。
自分で好きな場所を指定
して良い。
そこでGoのプログラムを書き、実行する。
go get
やgo install
を実行した時のインストール先となる。
$GOROOT
:
Goのルートディレクトリを指す。
$GOROOTのPATHは改めて設定すべきではない
。
理由は、既に然るべき場所を参照しているから。
複数のGoバージョンを使う
のであれば、設定が必要かも。
詳細は、以下参照
#実践
筆者は$GOPATHと$GOROOTについて完全に理解した
ので、早速bash_profile
を修正&反映する。
$ vi ~/.bash_profile
export GOPATH="$(brew --prefix golang)/libexec"
export PATH=$PATH:$HOME/go/bin
~
~
~
:wq
$ source ~/.bash_profile
go get
で欲しかった外部パッケージを再度取得
$ go get xxxxxxx
go: downloading xxxx
go: downloading xxxx
go: extracting xxxx
...
...
エラーで案内されたコマンドを再度叩く
うんともすんとも言わなかったこのコマンドが、何やら喋り始めたが、無視。
※この時のログ取れてませんでした...
$ go mod tidy
$ go mod vendor
最後は、go run foo.go
で実行確認をして、無事実行できることを確認。
経緯
で書いていたwarning
ですが、あれは$GOPATH
と$GOROOT
が同じディレクトリを指している場合に表示されるようです。
そうです、筆者はまだ完全に理解していませんでした
。
$GOPATH
と$GOROOT
が同じディレクトリを指しているということは、Goのルートディレクトリで作業をしていることになるので、気持ち悪いです。
なので、しっかり分けてあげたところwarningも出なく
なりました。
#最後に
この問題で2時間くらい潰してしまったので、同じ状況に陥ってしまった方々の救いになれば...と。
これで明日からまたGoをイジイジ出来ます。
以上です。