internalパッケージあるいは相対パッケージをimportする時、ローカルに完全一致するパスが存在する必要がある。
これは普段ならばあまり問題にならないが、forkしたリポジトリなどで問題になることがある。
問題になる例
例としてhttps://github.com/takashabe/google-cloud-go/がforkして作ったリポジトリになる。
ここで例えば以下のようにgo run
した時にinternalパッケージの解決が出来ずに死ぬ。
$ go run bigtable/cmd/cbt/cbt.go
bigtable/cmd/cbt/cbt.go:39:2: cannot find package "cloud.google.com/go/bigtable" in any of:
/usr/local/opt/go/libexec/src/cloud.google.com/go/bigtable (from $GOROOT)
/Users/takashabe/dev/src/cloud.google.com/go/bigtable (from $GOPATH)
bigtable/cmd/cbt/cbt.go:40:2: cannot find package "cloud.google.com/go/bigtable/internal/cbtconfig" in any of:
/usr/local/opt/go/libexec/src/cloud.google.com/go/bigtable/internal/cbtconfig (from $GOROOT)
/Users/takashabe/dev/src/cloud.google.com/go/bigtable/internal/cbtconfig (from $GOPATH)
解決策
- importを全て書き換える
import cloud.google.com/go/bigtale
->import github.com/takashabe/...
- ローカルでディレクトリ名を変更する
$GOPATH/src/github.com/takashabe/google-cloud-go
->$GOPATH/src/cloud.google.com/go...
もっと賢い方法がありそうだが、とりあえずは上で対処出来るはず…。他に良い方法があれば教えてください。