Edited at

GOPATH は適当に決めて問題ない


TL;DR



  • go get は Ruby でいう gem みたいなもん


  • $GOPATH は自分の環境に合わせて好きに指定してよい


    • 例えば $HOME/.go とか $HOME/go とか



  • 好きに設定してもいいけど、一度設定したらそれをずっと使い続けた方がたぶんいい

現在では、GOPATHを明示的に設定しない場合は自動的に設定される。

Wikiより


If no GOPATH is set, it is assumed to be $HOME/go on Unix systems and %USERPROFILE%\go on Windows.



ことの始まり

homebrewでGoをインストールしたらのっけから


Go 1.1 から go get コマンドは $GOROOT をパッケージダウンロード先として使わなくなりなりました。

go get 使うには $GOPATH が必要です。


と言われて、間違った設定をしてあとで苦労したくなかったので色々と調べた。


go get コマンド

% go help get


使い方: go get [-d] [-fix] [-u] [build flags] [packages]

パッケージ(依存するものも)をダウンロードしてインストールする。

-d フラグがあるとダウンロードだけでインストールしない。

-fix フラグは fix tool をダウンロードしたパッケージの依存関係を解消する前に実行する。(詳しくは godoc fix を見れば分かるらしい。)

-u フラグがあるとパッケージとその依存パッケージをアップデートする。

build flagsは go buildgo install のフラグを指定する。

パッケージを確認するとき get はローカルにインストールされている Go のバージョンと適合するブランチやタグを探す。最も重要なルールは、ローカルで走っているのが "go1" だったとすると、 get は "go1" という名前のブランチとタグを探すということ。もしそういうバージョンが無かったら、最新のものを取ってくる。

パッケージの指定の仕方については go help packages を見る。

どうやってソースコードを見つけるかは go help remote を見る。



GOPATH

% go help gopath


Goパスは import 文の解決に使われる。go/build パッケージで実装されている。

環境変数 GOPATH は Go コードを探す場所を表す。(PATH みたいな感じ)

Unix の場合はコロンで区切る。

Windows の場合はセミコロンで区切る。

Plan 9だとリスト。

GOPATH は標準の Go の外でパッケージをビルドしたりインストールする際に設定されていなければならない。

GOPATH に入っているディレクトリはそれぞれ決められた構造を持っていなければならない:

(詳しくは割愛)

例:

GOPATH=/home/user/gocode

/home/user/gocode/
src/
foo/
bar/ (go code in package bar)
x.go
quux/ (go code in package main)
y.go
bin/
quux (installed command)
pkg/
linux_amd64/
foo/
bar.a (installed package object)

Go は GOPATH の各ディレクトリからソースコードを探すが、ダウンロードしたファイルは常に GOPATH の中で一番最初のディレクトリにインストールされる。



結局どうすればいいのか

GOPATH は決まった場所を指定するものではなく、自分の環境で好きな場所を勝手に指定すればよい、という性質のものらしい。つまり、正しい場所を指定しておかないと Go が使えないとかそういった性質のものではない(それを恐れていた)、と。

インターネットを観測した感じだと


  • $HOME/go

  • $HOME/.go

あたりを設定している人が多い印象。設定は .bashrc.zshrc で行う。


~/.bashrc

export GOPATH=$HOME/.go