tjun月1日記

なんでもいいので毎月書きたい

GoogleAppEngine/Goでのディレクトリ構成

GAE/Goで、結構悩むのがディレクトリ構成です。 pkgをどう分けて、どこのディレクトリに何を置くか、自分はどうやってるか紹介します。

関連する記事はこのあたりです。

はじめに

  • 基本的にはGOPATH以下にコードを置くことを想定しています。 以下の例では$GOPATH/src/github.com/tjun/gaesample とします。
  • AppEngineは Go1.6 を利用している場合になります。1.8になると変わる部分があるかもしれません。
  • echoでサーバを書いていますが、構成にはあまり影響がないと思います。
  • vendoringはglideを使ってやってます
  • goappコマンドはあまり使っていません

方針

  • 依存するpkgは、バージョンを固定したいので vendor以下におきます。
  • デプロイスクリプトなどは、_deployなどアンダースコアから始まるディレクトリに入れます

ディレクトリ構成

以下のような感じでやってます。

$GOPATH/src/github.com/tjun/gaesample
|-- main/
|       |-- app.yaml
|       |-- index.yaml
|       |-- main.go  # AppEngineのエントリポイント
|       `-- public/   # img, cssなど静的なファイル
|
|-- controllers/   # コントローラ
|-- models/        # モデル
|-- views/         # view
|-- server/        # echoのサーバのエントリポイント
|-- router/router.go   # ルーティング
...                       # その他のpkgも直下に置く
|-- vendor/  
|
|--Makefile 
|-- _deploys/   # デプロイスクリプト置き場
|
...
  • クライアントのコードは省略していますが、ビルド時に main/public以下に持っていきます。

サーバをローカルで動かすときは

./dev_appserer.py main

で動かせます。 デプロイのときは、

./appcfg.py update main

になります。

この構成のいいところは、内部のpkgのimportが

import (
 "github.com/tjun/gaesample/models"
)

みたいな感じでわりと自然に書けることです。

GOPATH以下にコードを置いてると、CircleCIからのデプロイがそのままじゃできなかったりしますが、そのやり方はまた今度書きます。