# 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 に似た環境であれば大体以下のような設定になります: ```sh export GOPATH=/home/apple/mygo ``` 上のディレクトリを新たに作成し、上の一行を`.bashrc`または`.zshrc`もしくは自分の`sh`の設定ファイルに加えます。 Windows では以下のように設定します。新しくGOPATHと呼ばれる環境変数を作成します: ```sh 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を例にどのようにアプリケーションパッケージをコーディングするかご説明します。以下のコードを実行します。 ```sh cd $GOPATH/src mkdir mymath ``` sqrt.goというファイルを作成し、内容を以下のようにします。 ```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`を実行します。 インストールが終われば、以下のディレクトリに入り ```sh cd $GOPATH/pkg/${GOOS}_${GOARCH} //以下のファイルが現れるはずです。 mymath.a ``` この.aファイルはアプリケーションパッケージです。ならば我々はどのように実行できるでしょうか? 次にアプリケーション・プログラムを作成してこのアプリケーションパッケージをコールします。 アプリケーションパッケージmathappを作ります。 ```sh cd $GOPATH/src mkdir mathapp cd mathapp vim main.go ``` `$GOPATH/src/mathapp/main.go`コード: ```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の実行可能ファイルが生成されます。 ```sh ./mathapp ``` 以下のように出力されます。 ```sh Hello, world. Sqrt(2) = 1.414213562373095 ``` どのようにアプリケーションをインストールするのでしょうか。このディレクトリに入り、`go install`を実行すると、$GOPATH/bin/の下に実行可能ファイルmathappが作成されます。`$GOPATH/bin`が我々のPATHに追加されていることを思い出して下さい、コマンドラインから以下のように入力することで実行することができます。 ```sh 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の下にアプリケーションのソースコードが保存されているということです。 ## links * [目次]() * 前へ: [GOのインストール](<01.1.md>) * 次へ: [GOのコマンド](<01.3.md>)