今回はmacに、いい感じでバージョン&パッケージを管理できる開発環境を構築していこうと思います。
goenvの導入
まずはgolang自体のバージョンを管理するためのツールであるgolangを導入します。
goenvを通してgolangをインストールすることで、異なるバージョンを利用する必要がある時にスムーズに作業を継続できます。
基本的な使い方はrubyのrbenvや、pythonのpyenvと大差ありません。gvmというツールもあるのですが、個人的にrbenv,pyenvを使ってきたので、goenvを選択しました。
brew install goenv
まずはbrewでgoenvをインストールします。
あとは環境変数にgo言語のコマンドを実行した時の利用先のパスを設定します。
export PATH="$HOME/.goenv/bin:$PATH" eval "$(goenv init -)"
.bash_profileを編集したら、以下のコマンドで変更を適用します。
source ~/.bash_profile
Go言語のインストール
インストールしたgoenvを使用してGo言語をインストールします。
まずはインストールできるバージョンの確認。
goenv install -l
ずらーっとバージョンが並びます。今回は記事作成時点で最新の1.9をインストールします。
goenv install 1.9.0
インストールしたGo言語を有効化するために以下のコマンドを実行します。
goenv global 1.9.0
無事Go言語がインストールされたかを確認してみましょう。
go version
goenvでインストールしたバージョンが表示されていたら、Go言語までインストール完了となります。
direnvの導入
ここまででGo言語自体はインストールでき、開発可能な状態にはなりました。
しかし開発を行なっていると、特に複数プロジェクトに手をつけている場合においては、プロジェクトごとにインストールするパッケージをしっかりと分けて管理したいところ。
しかしGo言語ではGOPATHという環境変数に設定されたパスにどんどんパッケージが追加されていく仕様となっております。つまり上記を実現させるためには作業しているプロジェクトごとにGOPATHを切り替える必要が出てくるわけです。
これを手動でやっていたら、作業効率ガタ落ちですよね。その環境変数の切り替えを自動で実施してくれるのがdirenvというツールになります。
以下のコマンドでインストール。
brew install direnv
次にbash_profileに設定を追加します。EDITORはdirenvの設定ファイルを編集するときに起動されるエディターです。お好みで変更してもOKです。
echo 'eval "$(direnv hook bash)"' >> ~/.bash_profile echo 'export EDITOR=vim' >> ~/.bash_profile source ~/.bash_profile
設定が完了したら、実際に作業ディレクトリに移動して、direnvの設定ファイルを作成します。
まずは適当に作業ディレクトリを作業して、そのディレクトリに移動します。
cd ~/workspace/ mkdir go-sample cd go-sample
そしてdirenvの設定ファイルを作成するために以下のコマンドを打ちます。
direnv edit .
するとエディターが立ち上がって設定を追加できるようになります。以下の内容を入力して、保存します。
export GOPATH=$(pwd)
そうすると、現在いるディレクトリに
.envrcというファイルが新規作成できております。ここに記載した環境変数がそのディレクトリに移動した際に読み込まれるようになるわけです。めっちゃ便利。
vendoringについて
Go1.6からは依存パッケージを分けて管理することのできるVendoringが標準で適用されるようになりました。
もしGo1.5以下で環境構築する必要がある場合、以下のような環境変数を設定する必要があります。
export GO15VENDOREXPERIMENT=1
1.6以上であればスキップしてOKです。
glideの導入
残る課題はパッケージのインストール先とパッケージ管理です。
要するにRailsでいうGemfileで管理して、vendor配下にパッケージを配置するということをしたいわけです。
こんなわがままを実現してくれるのがglideというツールです。
なにはともあれインストール。
brew install glide
インストールが完了したら作業ディレクトリにて以下のコマンドを実行します。
mkdir src cd src mkdir myapp cd myapp glide create
途中でY or Nの選択肢は基本的にYでOKです。
Go言語のディレクトリ構成はプロジェクトディレクトリ配下にsrc/[アプリケーションディレクトリ]を作成し、そこに開発ソースを配置していくのが一般的な模様。glideの仕様上、[作業用ディレクトリ]/src/[アプリケーションディレクトリ]の構成を守らないと、上手くパッケージを読み込んでくれませんので、注意しましょう。
では実際にパッケージをインストール。今回は例としてWebフレームワークであるechoをインストールしてみます。
glide get github.com/labstack/echo
普通はgo getとやるところをglide getで実行します。
こちらも途中で選択肢が出てきますが、基本的にはM(minor)を選択しておけば問題ありません。
echoの動作確認のために、go-sample/src/myappにserver.goを作成し、以下のように記述します。echoのガイドを参考に進めています。
package main import ( "net/http" "github.com/labstack/echo" ) func main() { e := echo.New() e.GET("/", func(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!") }) e.Logger.Fatal(e.Start(":1323")) }
保存してサーバーを起動しようしたところ、エラーが発生しました。
go run server.go vendor/github.com/labstack/echo/echo.go:55:2: cannot find package "github.com/labstack/gommon/color" in any of: /Users/stobita/workspace/go-sample/src/myapp/vendor/github.com/labstack/gommon/color (vendor tree) /Users/stobita/.goenv/versions/1.9.0/src/github.com/labstack/gommon/color (from $GOROOT) /Users/stobita/workspace/go-sample/src/github.com/labstack/gommon/color (from $GOPATH) vendor/github.com/labstack/echo/echo.go:56:2: cannot find package "github.com/labstack/gommon/log" in any of: /Users/stobita/workspace/go-sample/src/myapp/vendor/github.com/labstack/gommon/log (vendor tree) /Users/stobita/.goenv/versions/1.9.0/src/github.com/labstack/gommon/log (from $GOROOT) /Users/stobita/workspace/go-sample/src/github.com/labstack/gommon/log (from $GOPATH) vendor/github.com/labstack/echo/echo.go:57:2: cannot find package "golang.org/x/crypto/acme/autocert" in any of: /Users/stobita/workspace/go-sample/src/myapp/vendor/golang.org/x/crypto/acme/autocert (vendor tree) /Users/stobita/.goenv/versions/1.9.0/src/golang.org/x/crypto/acme/autocert (from $GOROOT) /Users/stobita/workspace/go-sample/src/golang.org/x/crypto/acme/autocert (from $GOPATH)
色々調べてみると、glideでは依存パッケージが自動的にインストールされないケースがあるとかないとか・・・
というわけで先頭にあるcolorを手動でインストールします。
glide get github.com/labstack/gommon/color
すると無事echoが起動されますので、ブラウザでhttp://localhost:1323/にアクセスしてみましょう。
Hello worldが表示されていれば構築完了です!
まとめ
まだまだデファクトスタンダードが存在していない状態ではありますが、今回構築した環境であれば、Railsにおけるbundleに近い感覚で使えるかと思います。
今回の記事がGoを初めてたいと考えている人のお役に立てば幸いです。
紹介した方法で上手く行かない際はTwitterかお問い合わせでお声かけいただければ、対応できる範囲でお応えいたしますので、どうぞお気軽に。
閲覧いただき、ありがとうございました。