前回にgoa公式のgoaを始めるでapiを一本だけ作成しました(goaに触ってみる)

今回はその続きでgithubに上がってるgoaセラーの参考例
手元で動かしながら開発スタイルに慣れていこうと思います

基本的にはgithubに上がってるソースを見ながら
気づいた点をまとめていきます

controllersディレクトリの作成

controllersディレクトリを作って生成されるcontrollerを移す

$ tree ./ -L 1
./
├── Gopkg.lock
├── Gopkg.toml
├── app
・
・
├── bottle.go # ← こいつを下記のcontrollersに移す
├── controllers # ←
・
・
・
  • goaによって生成されるcontrolllerから差分のみ既存のコードに適用していくため

  • controllerに相当するコードは一度しか生成されないので

同じくapp_dev.goをmain.goと同じように設定する

ローカルで動かす実行ファイルも作っておく
基本はmain.goで生成されたものをコピペするだけ
ファイルの頭に下記のような記述をして、buildを分けられるようにする

app_dev.go
// +build app_dev

package main

こうすることでtagの記述でビルドを分けることができる

# local
$ go build -tags=app_dev -o cellar-dev

# prod
go build -o cellar-prod

Makefile作っとくといいですね

Makefile
#! /usr/bin/make
#
# Makefile for goa cellar example

build:
    @go build -o cellar

build-dev:
    @go build -o -tags=app_dev cellar-dev

ついでにコード生成のタスクも書いておく

Makefile
gen:
    @ls | grep -E '.go$$' | grep -v -E 'app_dev' | xargs rm -f
    @./vendor/github.com/goadesign/goa/goagen/goagen bootstrap -d path/to/design

# ↑のインデントがタブでないとMakefileではエラーになる難儀ですね。。
# Makefile:n: *** missing separator.  Stop.

designパッケージの分割

githubのリポジトリに従ってdesignパッケージを分割してみる

$ tree -L 1 design
design
├── api_difinition.go # API定義、hostとか全体の設定
├── health.go         # healthチェック、API自体が落ちてないか確認する用?
├── media_types.go    # レスポンス内容の定義
├── resources.go      # ルーティングの定義
└── user_types.go     # ユーザーが設定する基本型の拡張定義

ex.)

design/user_types.go
    Attribute("name", func() {
        MinLength(2)
        Example("Number 8")
    })

最後に

あとは実際にdesignに定義書いていって開発を進めていけば概ねokなのでしょうか
実際に書いていって詰まった点や、これが便利等あれば書いていきたいです

地味にScheme("ws")でwebsocket処理もサポートしているのがすごい
ただ、使っているのはgolang.org/x/net/websocketであり
gorilla/websocketではないです。。

このやり方がいいよというようなツッコミ歓迎です!