Skip to content

Latest commit

 

History

History
164 lines (128 loc) · 7.86 KB

File metadata and controls

164 lines (128 loc) · 7.86 KB

1.2 GOPATHとワーキングディレクトリ

GOPATH設定

go コマンドには重要な環境変数があります:$GOPATH1

(注:これはGoのインストールディレクトリではありません。以下では筆者のワーキングディレクトリで説明します。ご自身のマシン上のワーキングディレクトリに置き換えてください。)

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/mymath/sqrt.go(パッケージ名:"mymath")

以後私が新規に作成するアプリケーションまたはコードパッケージはsrcディレクトリに新規ディレクトリを作成します。ディレクトリ名はほぼコードパッケージの名前です。当然ネストしたディレクトリもありえます、例えば、srcの下にディレクトリ $GOPATH/src/github.com/astaxie/beedbというようなディレクトリを作成すると、このパッケージのパスは"github.com/astaxie/beedb"になります。パッケージ名は最後のディレクトリであるbeedbです。

以下のコードを実行します。

	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))
	}

どのようにプログラムをコンパイルするのでしょうか?このアプリケーションディレクトリに入り、go buildを実行すれば、このディレクトリの下にmathappの実行可能ファイルが生成されます。

	./mathapp

以下のように出力されます。

	Hello, world.  Sqrt(2) = 1.414213562373095

どのようにアプリケーションをインストールするのでしょうか。このディレクトリに入り、go installを実行します。すると、$GOPATH/bin/の下に実行可能ファイルmathappが作成されますので、コマンドラインから以下のように入力することで実行することができます。

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の下にアプリケーションのソースコードが保存されているということです。


[1] Windowsシステムの環境変数の形式は%GOPATH%です。本書では主にUnix形式を使いますので、Windowsユーザは適時自分の環境に置き換えてください。

links