GoでPackageをimportする際に、自鯖にgitを置いた時どうするのかとか、project内でのimportはどうするのがいいのかとかを調べました。
公式の資料を斜め読みしてメモってるのでミスってたら指摘いただけると助かります><
#資料
- Golang how to import local packages without gopath?
- Command go#Relative import paths
- Command go#Remote import paths
- How to Write Go Code(日本語訳)
- Go の相対パス import ができたりできなかったり
- GithubのGo言語プロジェクトにPull Requestを送るときのimport問題
Goの相対パスのエントリがとても重要だった。
#importの方法
標準packageのimport
import "testing"
import (
"fmt"
)
相対path
プロジェクト内でのimport
$GOPATH
配下での相対パスを用いたimportは許可されていないので利用できない。利用する場合は$GOPATH
以外の場所にプロジェクトを配置する必要がある。
import "./package1"
import "../package2"
他のホスティング環境からimport
公式のドキュメントから引用
有名なコードホスティングサービスは以下
Bitbucket (Git, Mercurial)
import "bitbucket.org/user/project"
import "bitbucket.org/user/project/sub/directory"
GitHub (Git)
import "github.com/user/project"
import "github.com/user/project/sub/directory"
Google Code Project Hosting (Git, Mercurial, Subversion)
import "code.google.com/p/project"
import "code.google.com/p/project/sub/directory"
import "code.google.com/p/project.subrepository"
import "code.google.com/p/project.subrepository/sub/directory"
Launchpad (Bazaar)
import "launchpad.net/project"
import "launchpad.net/project/series"
import "launchpad.net/project/series/sub/directory"
import "launchpad.net/~user/project/branch"
import "launchpad.net/~user/project/branch/sub/directory"
IBM DevOps Services (Git)
import "hub.jazz.net/git/user/project"
import "hub.jazz.net/git/user/project/sub/directory"
自前のホスティング環境からimportする
検証してないです><
サポートしているバージョン管理システムは以下、自前でコードをホスティングする場合は、いずれかのvcsを利用する
- Bazaar(.bzr)
- Git(.git)
- Mercurial(.hg)
- Subversion(.svn)
importに記述するpathはgithubなんかと同様に
repository.vcs/path
公式ドキュメントに記載されている例
import "example.org/user/foo.hg"
import "example.org/repo.git/foo/bar"
import pathが基地のコードホスティングサービスではなく、import pathにvcs修飾子がない場合、Go ToolはHTTPS/HTTP経由でのimportの実行を試し、ドキュメントHTMLの
内のタグを探索する<meta name="go-import" content="import-prefix vcs repo-root">
このドキュメントHTMLはrepositoryのrootに配置すればいいのかな・・・
go toolは以下を試すらしいので、そこで取得できれば良さそう。
https://example.org/pkg/foo?go-get=1 (preferred)
http://example.org/pkg/foo?go-get=1 (fallback)
Import Path Checking
package名の後に続けてホスティングpathを記述することで、ホスティング環境を明記できる。
package math // import "path"
package math /* import "path" * /
#整理
$GOPATH
はWORKSPACEを示す環境変数で基本的にこの中で作業する方がいい。
githubだとgithub.com/user/project
をベースパスとし、コードも$GOPATH/src/github.com/user/project
以下に配置するようにする。
ただし、$GOPATH
以下では相対パスでの解決はGoでは許可されていないので相対パスでのimportは利用できない。相対パスを利用したい場合は$GOPATH
以外でプロジェクトを構築したほうが良い。
この場合、$GOPATHに配置できるpackageとしての提供とは切り離して進めるべき。
githubでforkしたプロジェクトの場合
githubでforkしたprojectの場合ベースパスのuser名が変更されることで、forkしたrepositoryをgo getで取得しても失敗する。
その上、$GOPATH
内での相対パスが許可されていないので辛い。もともとこのエントリはgithubでforkしたときとかベースパスを将来的に変更することになる場合どうするんだろ?っていうのが発端で調べ始めたんだけど、現状解決策としては
この資料で解説されている通り、fork元のpathでgo get
してからforkしたrepositoryをgit remote
で登録するか、fork元をgit clone
する際にベースパスをfork元にしてやるしかない。
俺はforkしたらpull-req出さずに独自進化させるぜ!!!という場合は、import pathのベースパスを全部書き換えてやるしか無い。
ちょっと手軽さが足りないなって感じました。