忙しい人向け
解決策①: パスを通す
$ export GOPATH=$HOME/go;
$ export PATH=$PATH:$GOPATH/bin;
単純にパスが通っていないだけであればこれで解決するだろう。
解決策②: go get で $GOPATH/bin
に落としたバイナリを $GOROOT/bin
にコピーする
しかし、こっちが本記事の結論。
今回は、Goのバージョンを切り替えやすくするために $GOROOT にシンボリックリンクを貼っていて、実行環境にバイナリ(実行ファイル)を go get できていなかった。
経緯
当時の私は新たな MacBook PRO を手に入れ(貸与され)、配属先でGo製のAPIを開発することになっていたため、ワクワクしながらGoの開発環境を構築していた。
(後々躓くことも知らずに)言われるがままに環境構築を行い、ビルド、手元でユニットテストを回した。
通った!
「よし、これで開発者としてチームの一員になれるぞ...」
その日はそのまま退勤。「明日から頑張るぞ!」という決意と共に会社を後にした。
さらに、参画することになっているプロジェクトでは sqlboiler
というORMを使っているという情報を手に入れていた。生のSQLならまだしも、ActiveRecord以外のORMをまともに扱ったことがないこともあり、早速 sqlboiler
を触ってみようと考えていた。
やってみる
上を参考に、必要なパッケージを go get していく。
$ go get -u -t github.com/volatiletech/sqlboiler
$ go get github.com/volatiletech/sqlboiler/drivers/sqlboiler-psql
あらかた必要になりそうなもののインストールは済んだので、 sqlboiler コマンドの実行!
$ sqlboiler psql
しかしここでなぜか sqlboiler がないと怒られる
$ sqlboiler psql
-bash: sqlboiler: command not found
command not found ... ?
んん ... ? go get
したんだけどなと思いつつ確認する。
$ ls $GOPATH/bin
sqlboiler-psql* sqlboiler* その他省略
あれ?あるぞ?なぜ?
その後もあーだこーだしてるうちに時間が溶けてゆく。
原因を探る
まずはGOPATHの確認
$ echo $GOPATH
/Users/y-kanai/go
ふむ。
GOROOTは?
$ echo $GOROOT
/Users/y-kanai/goroot
goroot...? ってのはなんだ?
そんなもの知らんぞ?ってことで、
$ ls -la
drwxr-xr-x 5 y-kanai 931577470 160 7 19 23:21 go/
drwxr-xr-x@ 21 y-kanai 931577470 672 12 23 16:51 go1.13.14/
lrwxr-xr-x 1 y-kanai 931577470 25 8 4 12:11 goroot@ -> /Users/y-kanai/go1.xx.xx/
あ!シンボリックリンクを貼ってるやんけ!完全理解!!!
ってことは、$GOROOT/bin に sqlboiler がないんだろうな..と
$ ls $GOROOT/bin
シーン ...
つまり、今回の原因はGoのバージョンを切り替えやすくするために $GOROOT にシンボリックリンクを貼っていて、実行環境にバイナリを go get できていなかったことにありました。
用意されたドキュメントをコピーしてペロって貼ってると中々気づかないものですね。
解決策
go get
で $GOPATH/bin
に落としたバイナリ(実行ファイル)を、$GOROOT/bin
にコピーする!
$ cp $GOPATH/bin/sqlboiler $GOROOT/bin/
$ cp $GOPATH/bin/sqlboiler-psql $GOROOT/bin/
$ ls $GOROOT/bin/
go* gofmt* sqlboiler* sqlboiler-psql*
sqlboiler コマンドを実行!
$ sqlboiler psql
.
.
.
よし、ひとまず解決!
ここまで辿り着くのに1時間近くかかってしまいました。
振り返り
脳死コピーはダメですね。反省。
Goの複数バージョンを切り替えながら使っている方、
他に良い方法があれば、ぜひご教授願います。以上!