glideを使うとき、「GOPATHはどこにおいてもいい(設定しなくてもいい)」わけではない #golang

【注意】
glideは新機能の開発をやめており、[dep](https://github.com/golang/dep)への切り替えが推奨されています。
また、今後はvgo modulesというバージョン管理の仕組みがGoの組み込みになることが予定されています。

このため、いまからGoを始める方はいったんdepを使うことをおすすめします。

```
Golang Dep 
The Go community now has the dep project to manage dependencies. 
Please consider trying to migrate from Glide to dep.
If there is an issue preventing you from migrating please file an issue with dep so the problem can be corrected.
Glide will continue to be supported for some time but is considered to be in a state of support rather than active feature development.ent.
```
https://github.com/Masterminds/glide

## はじめに
Goをはじめる際に少し前のブログなどを参考にすると、「環境変数にGOPATHを設定する」と書いてあるものが多いかもしれません。

しかし、実は go1.8 からは GOPATH を設定する必要はありません。

1.8では、GOPATH が空の場合のデフォルト値として `$HOME/go` を利用するプロポーザルが採用されたためです。
[cmd/go: assume GOPATH=$HOME/go if not set #17262](https://github.com/golang/go/issues/17262)

### GOPATH に何も設定されていないのを確認する
```
$ echo $GOPATH

// 何も出力されません
```
自分で設定していないので、空になっています。
 
### デフォルトのGOPATHを確認する
```
$ go env | grep GOPATH

GOPATH="/Users/mom0tomo/go"
```

設定していない場合のデフォルトの GOPATH として `$HOME/go` が設定されているのが確認できます。


このように、環境変数GOPATHは設定しなくてもGoを使い始めることはできますが、[エラーの元となることがある](https://developers.eure.jp/tech/build-context-gopath/)ため以下のように明示的に設定したほうが良いです。

```:.bashrc
export GOPATH=$HOME/go
```

*** 
また、Go1.6以降ではvenderディレクトリが採用されたので、GOPATH/src配下に開発プロジェクトを置く必要もありません。

go get するとGOPATH/bin配下に外部パッケージがインストールされますが、開発を行うプロジェクトのディレクトリ内にvenderというディレクトリをおくことで、そのプロジェクトでのみgo get したい外部パッケージなどはvender配下にインストールすることができます。

外部パッケージがbuild, installされているかどうかは、vender->GOPATH->GOROOTの順で参照・判断されます。

つまり、開発するソースはGOPATH外のどこにあっても動かせます。

## glideで何が問題になるのか :confused:

glideは2017年9月現在(おそらく最も)メジャーなGoのベンダリングツールです。


<b>〚2017年12月更新〛
Go準標準パッケージとしてdepが採用されました。今後はdepが主流となるでしょう。</b>

導入方法は[こちらの記事](https://liginc.co.jp/305623)がわかりやすいです。

glideを利用することによってvenderディレクトリ配下に外部パッケージをバージョン固定した状態で置くことができます。

Rubyの `Gemfile/Gemfile.lock`や、PHPの `comporser.json/composer.lock`に近い感覚です。

### 問題発生
ただしglideは、<strong>$GOPATH/src配下にプロジェクトがないと動きません :exclamation: 
</strong>[Why vendor folder (created by glide) is not working as I expect in go 1.7.1 #602](https://github.com/Masterminds/glide/issues/602)

GOPATHを作業ディレクトリとは別の適当な場所に設定していたり、設定せずにいたりするとvender内を参照してくれずにずっと `cannot find package....`のエラーを吐き続けてしまいます。

とはいえ `$HOME/go`の下で開発するとなると下記の例のようになります。
作業するディレクトリを自分で選べないのはイマイチな感じ...

```
$HOME/go
  |-- bin
  |   `-- glide
  `-- src
      |-- github.com/mom0tomo/プロジェクト名
      |                  |           |-- glide.lock
      |                  |           |-- glide.yaml
      |                  |           `-- vendor
      |                  |           |-- github.com
      |                  |           |   |-- ユーザー名/glide管理するパッケージ名
      |                  |           |   `-- ユーザー名/glide管理するパッケージ名
      |                  |           `-- golang.org   
      |                  |
      |                  |-- ユーザー名/go getしたパッケージ名(glide管理しないパッケージ)
      |                  `-- ユーザー名/go getしたパッケージ名
      `-- golang.org   
```

またGOPATH配下にはgo getしたパッケージが入るので、最初に設定したものを変更するのは好ましくありません。
(一度go getしたパッケージが"cannot find.."と言われたり、気づかないうちに複数の場所にパッケージをダウンロードしてしまったりしがち)

## どうしたらよいのか :cry:
台湾の方がGOPATH/src配下におかなくてもglideを使えるようにするMakefileを書いてくれています。(まだ使ってみたことはないです）
[Development outside your default GOPATH using glide + Makefile ](https://www.reddit.com/r/golang/comments/6pf3v7/development_outside_your_default_gopath_using/?st=j79ptblu&sh=bfde445a)


また今度プロジェクトでglideを本格的に利用している方に会う機会があるので直接伺ってみます。
良い方法がわかったら追記します。

## Refer the link below:
* [【GO言語のパッケージ管理：決定版】「Glide」を使ってみよう | LIG](https://liginc.co.jp/305623)
* [GOPATH を build.Default.GOPATH で適切に扱う | eureka tech blog](https://developers.eure.jp/tech/build-context-gopath/)
* [他言語から来た人がGoを使い始めてすぐハマったこととその答え | Qiita](http://qiita.com/mumoshu/items/0d2f2a13c6e9fc8da2a4)
* [GOPATH は適当に決めて問題ない | Qiita](http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f)