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 build
とgo 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
で行う。
export GOPATH=$HOME/.go