😮 A surprisingly easy API server and generator in gRPC and Go
MIT License
😮 A surprisingly easy API server and generator in gRPC and Go
rails new
and create-react-app
)rails g (scaffold_)controller
)protoc
wrapper (inspired by protoeasy)grapiserver will not handle os signals from v0.5.x.
We recommend to use appctx.Global()
if you want to handle them.
cmd/server/run.go
// Application context
- ctx := context.Background()
+ ctx := appctx.Global()
- return s.ServeContext(ctx)
+ return s.Serve(ctx)
Some tools that are depended by grapi are updated. If you have a grapi project <=v0.3.x, you should migrate it.
Gopkg.toml
[[constraint]]
name = "github.com/izumin5210/grapi"
- version = "0.3.0"
+ version = "0.4.0"
dep ensure
tools.go
go get -u github.com/izumin5210/gex/cmd/gex
gex --regen
go mod init
go mod tidy
grapi.toml
package = "yourcompany.yourappname"
[grapi]
server_dir = "./app/server"
[protoc]
protos_dir = "./api/protos"
out_dir = "./api"
import_dirs = [
"./api/protos",
- "./vendor/github.com/grpc-ecosystem/grpc-gateway",
- "./vendor/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis",
+ '{{ module "github.com/grpc-ecosystem/grpc-gateway" }}',
+ '{{ module "github.com/grpc-ecosystem/grpc-gateway" }}/third_party/googleapis',
]
[[protoc.plugins]]
name = "go"
args = { plugins = "grpc", paths = "source_relative" }
[[protoc.plugins]]
name = "grpc-gateway"
args = { logtostderr = true, paths = "source_relative" }
[[protoc.plugins]]
name = "swagger"
args = { logtostderr = true }
rm Gopkg.*
grapi v0.3.0 has some breaking changes. If you have a grapi project <=v0.2.x, you should migrate it.
Gopkg.toml
[[constraint]]
name = "github.com/izumin5210/grapi"
- version = "0.2.2"
+ version = "0.3.0"
dep ensure
go get github.com/izumin5210/gex/cmd/gex
gex \
--add github.com/izumin5210/grapi/cmd/grapi \
--add github.com/izumin5210/grapi/cmd/grapi-gen-command \
--add github.com/izumin5210/grapi/cmd/grapi-gen-service \
--add github.com/izumin5210/grapi/cmd/grapi-gen-scaffold-service \
--add github.com/izumin5210/grapi/cmd/grapi-gen-type
gex \
--add github.com/golang/protobuf/protoc-gen-go \
--add github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway \
--add github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger
Gopkg.toml
-required = [
- "github.com/golang/protobuf/protoc-gen-go",
- "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway",
- "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger",
-]
grapi.toml
+package = "yourcompany.yourappname"
+
[grapi]
server_dir = "./app/server"
[protoc]
protos_dir = "./api/protos"
out_dir = "./api"
import_dirs = [
+ "./api/protos",
"./vendor/github.com/grpc-ecosystem/grpc-gateway",
"./vendor/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis",
]
[[protoc.plugins]]
- path = "./vendor/github.com/golang/protobuf/protoc-gen-go"
name = "go"
args = { plugins = "grpc", paths = "source_relative" }
[[protoc.plugins]]
- path = "./vendor/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway"
name = "grpc-gateway"
- args = { logtostderr = true }
+ args = { logtostderr = true, paths = "source_relative" }
[[protoc.plugins]]
- path = "./vendor/github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger"
name = "swagger"
args = { logtostderr = true }
$ grapi init awesome-app
$ grapi g service books
Or, if you need full standard methods, you can get them with following command:
$ grapi g scaffold-service books
And you should register generated services to the grapiserver.Engine
instance:
// app/run.go
// Run starts the grapiserver.
func Run() error {
s := grapiserver.New(
grapiserver.WithDefaultLogger(),
grapiserver.WithServers(
+ server.NewBookServiceServer(),
- // TODO
),
)
return s.Serve()
}
If you updated service definition, you can re-generate .pb.go
and .pb.gw.go
with following command:
$ grapi protoc
$ grapi server
$ grapi g command import-books
$ vim cmd/import-books/run.go # implements the command
$ grapi import-books # run the command
$ grapi build
curl -Lo grapi https://github.com/izumin5210/grapi/releases/download/v0.2.2/grapi_linux_amd64 && chmod +x grapi && sudo mv grapi /usr/local/bin
brew install izumin5210/tools/grapi
go get github.com/izumin5210/grapi/cmd/grapi
brew install dep
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
GO111MODULE=on
your env varsbrew install protobuf