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

GoでPackageをimportする際に、自鯖にgitを置いた時どうするのかとか、project内でのimportはどうするのがいいのかとかを調べました。
公式の資料を斜め読みしてメモってるのでミスってたら指摘いただけると助かります＞＜

#資料
* [Golang how to import local packages without gopath?](http://stackoverflow.com/questions/17539407/golang-how-to-import-local-packages-without-gopath)
* [Command go#Relative import paths](https://golang.org/cmd/go/#hdr-Relative_import_paths)
* [Command go#Remote import paths](https://golang.org/cmd/go/#hdr-Remote_import_paths)
* [How to Write Go Code(日本語訳)](https://gist.github.com/shkumagai/6069017)
* [Go の相対パス import ができたりできなかったり](http://qiita.com/tyochiai/items/d93f7540d9cf4f0a01bd)
* [GithubのGo言語プロジェクトにPull Requestを送るときのimport問題](http://deeeet.com/writing/2014/07/23/golang-pull-request/)

Goの相対パスのエントリがとても重要だった。

#importの方法
## 標準packageのimport
```go
import "testing"
import (
    "fmt"
)
```

## 相対path
プロジェクト内でのimport
`$GOPATH`配下での相対パスを用いたimportは許可されていないので利用できない。利用する場合は`$GOPATH`以外の場所にプロジェクトを配置する必要がある。

```go
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の<head>内の<meta>タグを探索する

```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を記述することで、ホスティング環境を明記できる。

```go
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したときとかベースパスを将来的に変更することになる場合どうするんだろ？っていうのが発端で調べ始めたんだけど、現状解決策としては
[この資料](http://deeeet.com/writing/2014/07/23/golang-pull-request/)で解説されている通り、fork元のpathで`go get`してからforkしたrepositoryを`git remote`で登録するか、fork元を`git clone`する際にベースパスをfork元にしてやるしかない。

俺はforkしたらpull-req出さずに独自進化させるぜ！！！という場合は、import pathのベースパスを全部書き換えてやるしか無い。
ちょっと手軽さが足りないなって感じました。