Edited at

Goでpackageのimportのやり方(自分用に整理)

More than 3 years have passed since last update.

GoでPackageをimportする際に、自鯖にgitを置いた時どうするのかとか、project内での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のベースパスを全部書き換えてやるしか無い。

ちょっと手軽さが足りないなって感じました。