1.2 GOPATHとワーキングディレクトリ
さきほどGoをインストールする際はGOPATH変数を設定する必要があるとご説明しました。Goはバージョン1.1から必ずこの変数を設定するようになっており、Goのインストールディレクトリと同じにはできません。このディレクトリは、GoのソースコードやGoの実行可能ファイル、並びにコンパイル済みのパッケージファイルを保存する為に使用します。そのためこのディレクトリには3つのサブディレクトリが存在します:src、bin、pkgです。
GOPATH設定
go コマンドは、ある重要な環境変数に依存しています:$GOPATH1
Windowsシステムにおいて環境変数の形式は%GOPATH%
です。この本の中では主にUnix形式を使用します。Windowsユーザは適時置き換えてください。
(注:これはGoのインストールディレクトリではありません。以下では筆者のワーキングディレクトリで説明します。もし異なるディレクトリを使用する場合はGOPATHをあなたのワーキングディレクトリに置き換えてください。)
Unix に似た環境であれば大体以下のような設定になります:
export GOPATH=/home/apple/mygo
上のディレクトリを新たに作成し、上の一行を.bashrc
または.zshrc
もしくは自分のsh
の設定ファイルに加えます。
Windows では以下のように設定します。新しくGOPATHと呼ばれる環境変数を作成します:
GOPATH=c:\mygo
GOPATHは複数のディレクトリを許容します。複数のディレクトリがある場合、デリミタに気をつけてください。複数のディレクトリがある場合Windowsはセミコロン、Linuxはコロンを使います。複数のGOPATHがある場合は、デフォルトでgo getの内容が第一ディレクトリとされます。
上の $GOPATH ディレクトリには3つのディレクトリがあります:
- src にはソースコードを保存します(例えば:.go .c .h .s等)
- pkg にはコンパイル後に生成されるファイル(例えば:.a)
- bin にはコンパイル後に生成される実行可能ファイル(このまま $PATH 変数に加えてもかまいません。もしいくつもgopathがある場合は、
${GOPATH//://bin:}/bin
を使って全てのbinディレクトリを追加してください)
以降私はすべての例でmygoを私のgopathディレクトリとします。
ソースコードディレクトリ構成
GOPATH内のsrcディレクトリはこれから開発するプログラムにとってメインとなるディレクトリです。全てのソースコードはこのディレクトリに置くことになります。一般的な方法では一つのプロジェクトが一つのディレクトリが割り当てられます、例えば:$GOPATH/src/mymath はmymathというアプリケーションパッケージか実行アプリケーションになります。これはpackageがmainかそうでないかによって決定します。mainであれば実行可能アプリケーションで、そうでなければアプリケーションパッケージになります。これに関してはpackageを後ほどご紹介する予定です。
新しくアプリケーションやソースパッケージを作成するときは、srcディレクトリの中にディレクトリを作るところから始めます。ディレクトリ名は一般的にソースパッケージ名になります。もちろんネストしたディレクトリも可能です。例えばsrcの中に$GOPATH/src/github.com/astaxie/beedbというディレクトリを作ったとすると、このパッケージパスは"github.com/astaxie/beedb"になり、パッケージ名は最後のディレクトリであるbeedbになります。
以下ではmymathを例にどのようにアプリケーションパッケージをコーディングするかご説明します。以下のコードを実行します。
cd $GOPATH/src
mkdir mymath
sqrt.goというファイルを作成し、内容を以下のようにします。
// $GOPATH/src/mymath/sqrt.goコードは以下の通り:
package mymath
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
このように私のアプリケーションパッケージディレクトリとコードが作成されました。注意:一般的にpackageの名前とディレクトリ名は一致させるべきです。
コンパイルアプリケーション
上のとおり、我々はすでに自分のアプリケーションパッケージを作成しましたが、どのようにコンパイル/インストールすべきでしょうか?2種類の方法が存在します。
1、対応するアプリケーションパッケージディレクトリに入り、go install
を実行すればインストールできます。
2,任意のディレクトリで以下のコードgo install mymath
を実行します。
インストールが終われば、以下のディレクトリに入り
cd $GOPATH/pkg/${GOOS}_${GOARCH}
//以下のファイルが現れるはずです。
mymath.a
この.aファイルはアプリケーションパッケージです。ならば我々はどのように実行できるでしょうか?
次にアプリケーション・プログラムを作成してこのアプリケーションパッケージをコールします。
アプリケーションパッケージmathappを作ります。
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go
$GOPATH/src/mathapp/main.go
コード:
package main
import (
"mymath"
"fmt"
)
func main() {
fmt.Printf("Hello, world. Sqrt(2) = %v\n", mymath.Sqrt(2))
}
このパッケージはmain
であることが分かると思います。importにおいてコールするパッケージはmymath
であり、これが$GOPATH/src
のパスに対応します。もしネストしたディレクトリであれば、importの中でネストしたディレクトリをインポートします。例えばいくつものGOPATHがあった場合も同じで、Goは自動的に複数の$GOPATH/src
の中から探し出します。
さて、どのようにプログラムをコンパイルするのでしょうか?このアプリケーションディレクトリに入り、go build
を実行すれば、このディレクトリの下にmathappの実行可能ファイルが生成されます。
./mathapp
以下のように出力されます。
Hello, world. Sqrt(2) = 1.414213562373095
どのようにアプリケーションをインストールするのでしょうか。このディレクトリに入り、go install
を実行すると、$GOPATH/bin/の下に実行可能ファイルmathappが作成されます。$GOPATH/bin
が我々のPATHに追加されていることを思い出して下さい、コマンドラインから以下のように入力することで実行することができます。
mathapp
この場合も以下のように出力されます。
Hello, world. Sqrt(2) = 1.414213562373095
ここではどのように実行可能アプリケーションをコンパイル/インストールし、ディレクトリ構造を設計するかについてご紹介しました。
リモートパッケージの取得
go言語はリモートパッケージを取得するツールgo get
を持っています。現在go getは多数のオープンソースリポジトリをサポートしています(github、googlecode、bitbucket、Launchpad)
go get github.com/astaxie/beedb
go get -u オプションはパッケージの自動更新を行います。また、go get時に自動的に当該のパッケージの依存する他のサードパーティパッケージを取得します。
このコマンドでふさわしいコードを取得し、対応するオープンソースプラットホームに対し異なるソースコントロールツールを利用します。例えばgithubではgit、googlecodeではhg。そのためこれらのコードを取得したい場合は、先に対応するソースコードコントロールツールをインストールしておく必要があります。
上述の方法で取得したコードはローカルの以下の場所に配置されます。
$GOPATH
src
|--github.com
|-astaxie
|-beedb
pkg
|--対応プラットフォーム
|-github.com
|--astaxie
|beedb.a
go getは以下のような手順を踏みます。まずはじめにソースコードツールでコードをsrcの下にcloneします。その後go install
を実行します。
コードの中でリモートパッケージが使用される場合、単純にローカルのパッケージと同じように頭のimportに対応するパスを添えるだけです。
import "github.com/astaxie/beedb"
プログラムの全体構成
上記で作成したローカルのmygoのディレクトリ構造は以下のようになっています。
bin/
mathapp
pkg/
プラットフォーム名/ 例:darwin_amd64、linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go
上述の構成から明確に判断できるのは、binディレクトリの下にコンパイル後の実行可能ファイルが保存され、pkgの下に関数パッケージが保存され、srcの下にアプリケーションのソースコードが保存されているということです。