internalパッケージとfork

Posted on

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...

もっと賢い方法がありそうだが、とりあえずは上で対処出来るはず…。他に良い方法があれば教えてください。