背景
- 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のパスに合うように