goa v3のインストールからとりあえず実行出来るかの確認まで
v3のインストール兼実行方法が載ってない気がしたので。
あくまでインストールと、公式のGetting Startedを実行してみる手順を纏めた物、後自分がハマった所。
必要なの
-
go 1.11以降(モジュールを使用する為)
また、httpだけでなく、gRPCを使用する場合は下記も必要になる。
今回は無しでいきます。 -
-
protoc-gen-go
go get -u github.com/golang/protobuf/protoc-gen-go
-
インストール
GO111MODULE=onはこの後も必要なのでbashrcにでも。
$ export GO111MODULE=on
$ go get -u goa.design/goa/v3
$ go get -u goa.design/goa/v3/...
チュートリアル
公式のGetting Startedより。
今回はcalcというのを作ります。
go mod init
を忘れずに。
$ mkdir -p calc/design
$ cd calc
$ go mod init calc
$ go get -u goa.design/goa/v3
$ go get -u goa.design/goa/v3/...
$ vim design/design.go
design.goにこのコードを書く
package design
import (
. "goa.design/goa/v3/dsl"
)
var _ = API("calc", func() {
Title("Calculator Service")
Description("Service for adding numbers, a Goa teaser")
Server("calc", func() {
Host("localhost", func() {
URI("http://localhost:8000")
})
})
})
var _ = Service("calc", func() {
Description("The calc service performs operations on numbers.")
Method("add", func() {
Payload(func() {
Field(1, "a", Int, "Left operand")
Field(2, "b", Int, "Right operand")
Required("a", "b")
})
Result(Int)
HTTP(func() {
GET("/add/{a}/{b}")
})
})
Files("/openapi.json", "../../gen/http/openapi.json")
})
上記コードをdesign.goに書いた後に、calcディレクトリにて下記コマンド2つを実行する。
$ goa gen calc/design
$ goa example calc/design
色々生成された後に、一度下記のようにcalc.goの内容を書き変える。
func (s *calcsrvc) Add(ctx context.Context, p *calc.AddPayload) (res int, err error) {
return p.A + p.B, nil
}
その後ビルドする。calc.goの内容を書き変えるのを忘れずに。
$ go build ./cmd/calc && go build ./cmd/calc-cli
無事ビルドが終わったら実行。
$ ./calc
同時にサーバー側だけでなくクライアント側(clc-cli)も作成してくれている。
勿論curl
等でもいいが、下記でサーバーへのリクエストが出せる。
$ ./calc-cli --url="http://localhost:8000" calc add --a 1 --b 2
3
注意点
自分が詰まった所とかとか。
- モジュールを使用しているので、必ずgoのバージョンが1.1以上である事。
- Ubuntuのaptだと1.0か何かでダメだったのでsnapにした。
- GO111MODULE=onを環境変数に入れるのを忘れない事。
-
go mod init
を必ずしている事- これ忘れて
go get ~
してもずっとエラーでインストール出来なかった。
- これ忘れて
-
goa gen
コマンド等を実行しているディレクトリが間違えていないか。 - calc.goを書き変えるのを忘れないようにねー。
- 確か足した結果はそのままだと返ってこない筈。
- このサンプルでは、公式のコードを削ってhttpのみにしているが、gRPCが入っている場合は必要なのにあるgRPCに必要な物を入れる事。