読者です 読者をやめる 読者になる 読者になる

kodama-tech.blog

技術的なこといろんなこと書きます。golangに関すること多めです。

GOPATHの設定とgo get

こんにちは。こだまです。

GOPATHとgo getについて書いていきます。

そもそもGOPATHとは?

簡単に言うと、GOPATHとはgoのソースを取りまとめておく場所を指定する環境変数です。
goは様々なパッケージを使って開発を行っていくのですが、そのソースをわかりやすくひとつの場所にまとめておこうよ、ということでこのGOPATHを設定していきます。マイクロサービス的な思想なのかなと個人的には思っております。
goをhomebrew等でインストールした際にPATHは自動で設定されましたが、GOPATHは自分で設定する必要があります。

それではさっそく設定していきましょう。

今回も想定をmacで行っていきます。

Q1. 環境変数をどこに書けば良いのか?
A1. ずばり、bash_profileに書きます。

windowsであればホームからシステム環境変数を探して入力することができるのですが、macにはないので、ターミナルからvimを使って環境変数を設定します。
$ vim ~/.bash_profileでGOPATHの設定を書き込みます。
既に他の言語等で環境変数を指定したことある方は既存のものに、初めて環境変数を触るのであれば、この機会に新しく作りましょう。
先ほどのコマンドで.bash_profileが新規に作成されます。

Q2. どこにGOPATHをせっていすれば良いの?
A2. どこでも問題はありませんが、大体は以下の場所かなと思います。
$HOME/go $HOME/dev/go

理由の1つとして開発を今後行っていく際に階層が深いところにあると参照するのが異常にめんどくさい、ということがあります。
今回は$HOME/dev/goで行います。

実際に設定をしていこう

まず、事前確認として何も行わない状態で$ echo $GOPATHをすると何も起こりません。
設定します。ターミナルでの流れは以下の流れです。

$ vim ~/.bash_profile

.bash_profile

export GOPATH=$HOME/dev/go
export PATH=$PATH:$GOPATH/bin

はい、以上です。とても簡単ですね。
.bash_profileの2行目についてはこの後説明するので今はとりあえず設定しておく気持ちでいてください。
最後に環境変数を有効にする為に$ source ~/.bash_profileを実行します。これで完成です。
では、しっかり設定されたかどうかを確認します。
先ほどの$ echo $GOPATHと打つと、画面に先ほど.bash_profileに記述したGOPATHが表示されると思います。
これでGOPATHの設定は完了です。

go getを行う

次に、go getを行います。

Q1. go getとはなんぞや?
A1. goの各種外部パッケージ等を取得するコマンドです。

彼はgoの開発には欠かせない存在です。

それでは試しにgoの開発支援ツールの代表であるgoimportsをgo getしてみましょう。
(ちなみにgoimportsはimport文の自動調整を行ってくれるものです。これも後日記事にしようと思います。)

$ go get -v golang.org/x/tools/cmd/goimports

これでgoimportsがインストールされました。ちなみに-vはgo getの進捗状況を確認するためのフラグです。
ここで$GOPATH配下を確認してみましょう。

$ ls $GOPATH
bin pkg src

上記の構成になっていると思います。
先ほど.bash_profileの2行目に設定したものについてですが、go getをした際にgoで作られたコマンドラインツールの実行ファイルを$GOPATH/binに配置します。そのため、PATH変数として2行目が必要だったわけです。
なお、goimportsのソースコードはsrc/配下に位置します。

つまり、go getした際にソースはGOPATH/src配下に、実行ファイルはGOPATH/binに自動でインストールされるということです。

ちなみに、go getは対象の依存パッケージも一緒にダウンロードしてくれるものです。
パッケージ管理として使用できます。おそらく大体の人はglideを使用すると思いますが。。。

最後に、go get先の指定方法ですが、URLを指定することで取得できます。
また、以下のパッケージ管理ツール類はURLでなくとも自動で判断してくれます。

ex)
Bitbucket (Git, Mercurial)
    ex)
    import "bitbucket.org/user/project"
    import "bitbucket.org/user/project/sub/directory"
GitHub (Git)
    ex)
    import "github.com/user/project"
    import "github.com/user/project/sub/directory"
Launchpad (Bazaar)
    ex)
    import "launchpad.net/project"
    import "launchpad.net/project/series"
    import "launchpad.net/project/series/sub/directory"
IBM DevOps Services (Git)
    ex) 
    import "hub.jazz.net/git/user/project"
    import “hub.jazz.net/git/user/project/sub/directory"

終わりに

いやはや、go getはなんとも便利ですね。
ちなみに、GOPATHはgo getだけでなく、goの開発で使用する各種ツールでも必要となるので、設定はしっかり行うことが大事です。
次回はちょろっと今回出てきた開発支援ツールのお話をしようかなと思います。ではでは。

最後に

先の話ですが、go1.8にはGOPATHも自動で設定されるように変更されるかも?な感じです。
これでもうGOPATHの設定に悩まなくて済みますね。
https://github.com/golang/go/issues/17262
(この記事の必要性がなくなりますね。)