Help us understand the problem. What is going on with this article?

go get したのに command not found で配属直後に躓いた話

忙しい人向け

解決策①: パスを通す

$ 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の複数バージョンを切り替えながら使っている方、
他に良い方法があれば、ぜひご教授願います。以上!

dip-net
ディップ株式会社は「バイトル」「はたらこねっと」などの求人情報サービスをはじめ、人工知能専門メディア「AINOW」、スタートアップ専門メディア「スタートアップタイムズ」、アニメなどの舞台を紹介するサイト「聖地巡礼マップ」といった新しい分野のサービスを自社で開発・運営しています。
https://www.dip-net.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away