LoginSignup
2

More than 3 years have passed since last update.

go getしてから、プログラムが実行できなくなり、解決するまでの話

Last updated at Posted at 2019-12-23

経緯

実行環境は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 getgo 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をイジイジ出来ます。

以上です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2