すでにインターネット上に日本語の情報がいろいろありますが、自分用に備忘録として書き溜めておきます。
GOPATHって何?
詳しくは この記事 かgo helpを参照のこと。
$ go help gopath
外部からパッケージをビルドしたりインストールするのに必要。
go get を実行した際に参照され、 $GOPATH/src 以下にgetしたデータが入る。
例えば、以下のコマンドを実行すると、$GOPATH/src に golang.org/x/net/html のディレクトリができ、htmlパッケージに関連するデータが入る(ちなみに golang.org/x/net/html パッケージはHTMLのパースなどの機能をサポートするパッケージ)。
$ go get golang.org/x/net/html
$GOPATH が通っている箇所に入ったパッケージは、以下のようにgolangのソースファイルでインポートすることが可能。
import "golang.org/x/net/html"
GOPATHはどこに設定すれば良い?
どこでも良い。
調べた限りでは $HOME/go に設定している人が多そう。
$ export GOPATH=$HOME/go
GOPATHは複数指定できるの?
できる。ただし1つ目に指定したもの以外は無効な場合がある。
例として、以下のようにGOPATHを指定したとする。
$ export GOPATH=$HOME/go:$HOME/golang:$HOME/workspace/go
指定した全てのGOPATHが有効なのは、Goコンパイラが外部のパッケージを探す場合のみである。
つまり、import文で指定したパッケージはGOPATHが通っている箇所であればコンパイラが見つけることができる(コンパイルエラーにならない)。
$HOME/workspace/go/src 以下に配置したパッケージはインポートすることができる。
逆に1つ目のGOPATHしか有効にならないのは、go get により外部のパッケージをダウンロード・インストールする場合である。
go get コマンドを使用すると外部のパッケージは必ず1つ目に指定した $HOME/go にインストールされる。
ソースは以下。
そろそろ真面目に Golang 開発環境について考える — GOPATH 汚染問題
外部パッケージのインポートに相対パスを使っても良い?
import "./foo"
import "../bar/baz"
以下の理由により非推奨。
- コンパイルのたびにパッケージ化するため、コンパイルが遅くなる
- go getが使えない
ソースは以下。
Golangで自分自身で定義したパッケージをインポートする方法あれこれ
また、GOPATH配下では上記のような相対パスによるインポートは認められない。