LoginSignup
2
1

More than 3 years have passed since last update.

GoのサンプルWebアプリをローカルで実行した時にはまったことのメモ

Last updated at Posted at 2020-02-11

背景

やっていたこと

  • ホームディレクトリに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/...という絶対パスでの書き方が推奨されている
  • 何も考えずにgit cloneでローカルに落としてくると、importに記載したパスに合わないため、パッケージが見つからずエラーになる

Gitで管理したい場合はどうするのか

  • 個人的にローカルで実行させるだけなら上記の方法で問題無いが、チームで開発するなどの理由でGitで管理したい場合はどうするのか
  • 正解は無さそうだが、以下の2パターンがありそう
    • importのパスに合うようにgit cloneする
    • 大元のリポジトリをforkし、go getで取得したパスにgit remote addでforkしたリポジトリへの参照を追加
      • fork先へプッシュし、originへのプルリクエストを作成する

参考

2
1
0

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
1