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

【Go】direnvとglideで開発環境構築してパッケージ管理

はじめに

開発始めようとして以下が問題があったので整理しておく。

前提条件としては以下
・複数人での開発で各々のPCで開発を想定
・コードはgitで管理

で、サードパーティのパッケージをどう管理するかとういのが問題点でした。
そのままやると$GOPATH以下に全て入ってしまい管理できない

go getするシェルスクリプトを共有してもできなくはないけど、ちょっときついかな。。。
で、探した結果以下のツールを使えばよいみたいでした
・direnv : ディレクトリごとに環境変数を切り替えられる
・glide : 必要なパッケージをyaml形式の設定ファイルを管理できる

両方ともhomebrewでインストールできた

direnvを使う

インストール

$ brew install direnv

~/.bashrcに以下を追加(エディタはなんでもOK)

export EDITOR=vi
eval "$(direnv hook bash)"

ちなみに上記の設定がないと後で以下のエラーで怒られる

$ direnv edit .
direnv: $EDITOR not found.
The file /path/to/project/.envrc does not exist.
direnv: error exit status 1

環境変数設定

$ cd /path/to/project
$ direnv edit .

〜指定したエディタで.envrcが開かれるので以下を追記
export GOPATH=`pwd`
export GO15VENDOREXPERIMENT=1

$ direnv allow # .envrc編集後にエラーが出たらこれを

ここまででディレクトリごとに$GOPATHが設定できるようになった

glideを使う

ちなみに最終的なディレクトリ構成
(これが頭に入ってなくてやってたので上手くいかなかった)

$ tree /path/to/project/ -L 3
/path/to/project/
└── src
    ├── glide.lock
    ├── glide.yaml
    ├─app
    │ └── main.go
    └── vendor
        ├── github.com
        └── golang.org

インストール

$ brew install glide

アプリを作る(今回はWebフレームワークEchoのHello worldで)
vi src/app/main.go

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

glideを使う

$ cd src
$ glide create
$ glide up

ここまでで
glide.lock、glide.yamlが生成されるのでこれを共有。
vendorが作られてパッケージが入るのでこちらは管理対象外とする(各々でglide up)

おわりに

ちなみに1番はまったのが以下でした
・goのディレクトリ構成をちゃんと理解してなかった
・glideのバージョンが古かった

glideはbrewから入れるならupdateしてから行いと。。。
以上です