前回に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
ではないです。。
このやり方がいいよというようなツッコミ歓迎です!