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

  • 197
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

TL;DR

  • go get は Ruby でいう gem みたいなもん
  • $GOPATH は自分の環境に合わせて好きに指定してよい
    • 例えば $HOME/.go とか $HOME/go とか
  • 好きに設定してもいいけど、一度設定したらそれをずっと使い続けた方がたぶんいい

ことの始まり

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