背景
- Goプログラミング実践入門に記載されているサンプルWebアプリのコードをローカルで実行しようとしたときにはまったことのメモ
やっていたこと
- ホームディレクトリに
git cloneしてそのままgo buildをした - すると以下のエラーが
route_main.go:5:2: cannot find package "chitchat/data" in any of:
/usr/local/Cellar/go/1.13.4/libexec/src/chitchat/data (from $GOROOT)
/Users/XXXXXX/go/src/chitchat/data (from $GOPATH)
- route_main.goを見てみると、importで自プロジェクトのパッケージを呼び出しており、そこが悪さをしていそう
import (
"github.com/mushahiroyuki/gowebprog/ch02/chitchat/data"
)
解決策
- 今回のように、単純に動かすだけなら
go getコマンドでソースを取得すれば良い
$ go get github.com/mushahiroyuki/gowebprog/ch02/chitchat/data
-
go getコマンドによって、以下の処理が行われる-
$GOPATH/binに実行ファイルが置かれる -
$GOPATH/srcにパッケージのソースコードが置かれる-
$GOPATH/src/github.com/mushahiroyuki/gowebprog/ch02/chitchatというパスに置かれる
-
-
-
実行するだけなら、
$GOPATH/bin配下に取得された実行ファイルを起動させればよい- つまり、自分でbuildする必要がなかった
-
ソースを変更しても、
go buildで新しい実行ファイルが生成されるので問題なさそう
なぜエラーになっていたのか
- 実行できるにしても最初に発生していたエラーは何なのか
- それは、importに指定する
github.com/mushahiroyuki/...というパスは、$GOPATH/srcからのパスに対応しているため -
go getでソースを取得すると、$GOPATH/src配下に作成されるパスがimportに記載したパスと一致することになる- importへの記載は公式ドキュメントに書かれているように、同じプロジェクト内であっても
github.com/...という絶対パスでの書き方が推奨されている
- importへの記載は公式ドキュメントに書かれているように、同じプロジェクト内であっても
- 何も考えずに
git cloneでローカルに落としてくると、importに記載したパスに合わないため、パッケージが見つからずエラーになる
Gitで管理したい場合はどうするのか
- 個人的にローカルで実行させるだけなら上記の方法で問題無いが、チームで開発するなどの理由でGitで管理したい場合はどうするのか
- 正解は無さそうだが、以下の2パターンがありそう
- importのパスに合うように
git cloneする - 大元のリポジトリをforkし、
go getで取得したパスにgit remote addでforkしたリポジトリへの参照を追加- fork先へプッシュし、originへのプルリクエストを作成する
- importのパスに合うように