From ef5fad469005fc22bfb8c2d3277d475ef2c8a8b0 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 10 Sep 2021 12:02:04 +0200 Subject: [PATCH 1/7] Move file generation to new package --- cmd/gomu/cmd/cli/new/new.go | 69 +++---------------- cmd/gomu/generate/config.go | 11 +++ cmd/gomu/generate/files.go | 52 ++++++++++++++ .../cli/new => generate}/template/docker.go | 0 .../new => generate}/template/gitignore.go | 0 .../cli/new => generate}/template/handler.go | 0 .../new => generate}/template/kubernetes.go | 0 .../cli/new => generate}/template/main.go | 0 .../cli/new => generate}/template/makefile.go | 0 .../cli/new => generate}/template/module.go | 0 .../cli/new => generate}/template/plugins.go | 0 .../cli/new => generate}/template/proto.go | 0 .../cli/new => generate}/template/skaffold.go | 0 13 files changed, 73 insertions(+), 59 deletions(-) create mode 100644 cmd/gomu/generate/config.go create mode 100644 cmd/gomu/generate/files.go rename cmd/gomu/{cmd/cli/new => generate}/template/docker.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/gitignore.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/handler.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/kubernetes.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/main.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/makefile.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/module.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/plugins.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/proto.go (100%) rename cmd/gomu/{cmd/cli/new => generate}/template/skaffold.go (100%) diff --git a/cmd/gomu/cmd/cli/new/new.go b/cmd/gomu/cmd/cli/new/new.go index 13740ec515..8fbf5aeec4 100644 --- a/cmd/gomu/cmd/cli/new/new.go +++ b/cmd/gomu/cmd/cli/new/new.go @@ -4,12 +4,11 @@ import ( "fmt" "os" "path" - "path/filepath" "strings" - "text/template" "github.com/asim/go-micro/cmd/gomu/cmd" - tmpl "github.com/asim/go-micro/cmd/gomu/cmd/cli/new/template" + "github.com/asim/go-micro/cmd/gomu/generate" + tmpl "github.com/asim/go-micro/cmd/gomu/generate/template" "github.com/urfave/cli/v2" ) @@ -24,21 +23,6 @@ var flags []cli.Flag = []cli.Flag{ }, } -type config struct { - Alias string - Comments []string - Dir string - Vendor string - Client bool - Jaeger bool - Skaffold bool -} - -type file struct { - Path string - Tmpl string -} - // NewCommand returns a new new cli command. func init() { cmd.Register(&cli.Command{ @@ -105,7 +89,7 @@ func createProject(ctx *cli.Context, pt string) error { fmt.Printf("creating %s %s\n", pt, name) - files := []file{ + files := []generate.File{ {".dockerignore", tmpl.DockerIgnore}, {".gitignore", tmpl.GitIgnore}, {"Dockerfile", tmpl.Dockerfile}, @@ -115,17 +99,17 @@ func createProject(ctx *cli.Context, pt string) error { switch pt { case "client": - files = append(files, []file{ + files = append(files, []generate.File{ {"main.go", tmpl.MainCLT}, }...) case "function": - files = append(files, []file{ + files = append(files, []generate.File{ {"handler/" + name + ".go", tmpl.HandlerFNC}, {"main.go", tmpl.MainFNC}, {"proto/" + name + ".proto", tmpl.ProtoFNC}, }...) case "service": - files = append(files, []file{ + files = append(files, []generate.File{ {"handler/" + name + ".go", tmpl.HandlerSRV}, {"main.go", tmpl.MainSRV}, {"proto/" + name + ".proto", tmpl.ProtoSRV}, @@ -135,7 +119,7 @@ func createProject(ctx *cli.Context, pt string) error { } if ctx.Bool("skaffold") { - files = append(files, []file{ + files = append(files, []generate.File{ {"plugins.go", tmpl.Plugins}, {"resources/clusterrole.yaml", tmpl.KubernetesClusterRole}, {"resources/configmap.yaml", tmpl.KubernetesEnv}, @@ -145,7 +129,7 @@ func createProject(ctx *cli.Context, pt string) error { }...) } - c := config{ + c := generate.Config{ Alias: name, Dir: dir, Vendor: vendor, @@ -184,41 +168,8 @@ func protoComments(name, dir string) []string { } } -func create(files []file, c config) error { - for _, file := range files { - fp := filepath.Join(c.Dir, file.Path) - dir := filepath.Dir(fp) - - if _, err := os.Stat(dir); os.IsNotExist(err) { - if err := os.MkdirAll(dir, 0755); err != nil { - return err - } - } - - f, err := os.Create(fp) - if err != nil { - return err - } - - fn := template.FuncMap{ - "dehyphen": func(s string) string { - return strings.ReplaceAll(s, "-", "") - }, - "lower": strings.ToLower, - "title": func(s string) string { - return strings.ReplaceAll(strings.Title(s), "-", "") - }, - } - t, err := template.New(fp).Funcs(fn).Parse(file.Tmpl) - if err != nil { - return err - } - - err = t.Execute(f, c) - if err != nil { - return err - } - } +func create(files []generate.File, c generate.Config) error { + generate.Create(files, c) for _, comment := range c.Comments { fmt.Println(comment) diff --git a/cmd/gomu/generate/config.go b/cmd/gomu/generate/config.go new file mode 100644 index 0000000000..e3d76dbb1b --- /dev/null +++ b/cmd/gomu/generate/config.go @@ -0,0 +1,11 @@ +package generate + +type Config struct { + Alias string + Comments []string + Dir string + Vendor string + Client bool + Jaeger bool + Skaffold bool +} diff --git a/cmd/gomu/generate/files.go b/cmd/gomu/generate/files.go new file mode 100644 index 0000000000..cc5c015862 --- /dev/null +++ b/cmd/gomu/generate/files.go @@ -0,0 +1,52 @@ +package generate + +import ( + "html/template" + "os" + "path/filepath" + "strings" +) + +type File struct { + Path string + Template string +} + +func Create(files []File, c Config) error { + for _, file := range files { + fp := filepath.Join(c.Dir, file.Path) + dir := filepath.Dir(fp) + + if _, err := os.Stat(dir); os.IsNotExist(err) { + if err := os.MkdirAll(dir, 0755); err != nil { + return err + } + } + + f, err := os.Create(fp) + if err != nil { + return err + } + + fn := template.FuncMap{ + "dehyphen": func(s string) string { + return strings.ReplaceAll(s, "-", "") + }, + "lower": strings.ToLower, + "title": func(s string) string { + return strings.ReplaceAll(strings.Title(s), "-", "") + }, + } + t, err := template.New(fp).Funcs(fn).Parse(file.Template) + if err != nil { + return err + } + + err = t.Execute(f, c) + if err != nil { + return err + } + } + + return nil +} diff --git a/cmd/gomu/cmd/cli/new/template/docker.go b/cmd/gomu/generate/template/docker.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/docker.go rename to cmd/gomu/generate/template/docker.go diff --git a/cmd/gomu/cmd/cli/new/template/gitignore.go b/cmd/gomu/generate/template/gitignore.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/gitignore.go rename to cmd/gomu/generate/template/gitignore.go diff --git a/cmd/gomu/cmd/cli/new/template/handler.go b/cmd/gomu/generate/template/handler.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/handler.go rename to cmd/gomu/generate/template/handler.go diff --git a/cmd/gomu/cmd/cli/new/template/kubernetes.go b/cmd/gomu/generate/template/kubernetes.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/kubernetes.go rename to cmd/gomu/generate/template/kubernetes.go diff --git a/cmd/gomu/cmd/cli/new/template/main.go b/cmd/gomu/generate/template/main.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/main.go rename to cmd/gomu/generate/template/main.go diff --git a/cmd/gomu/cmd/cli/new/template/makefile.go b/cmd/gomu/generate/template/makefile.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/makefile.go rename to cmd/gomu/generate/template/makefile.go diff --git a/cmd/gomu/cmd/cli/new/template/module.go b/cmd/gomu/generate/template/module.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/module.go rename to cmd/gomu/generate/template/module.go diff --git a/cmd/gomu/cmd/cli/new/template/plugins.go b/cmd/gomu/generate/template/plugins.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/plugins.go rename to cmd/gomu/generate/template/plugins.go diff --git a/cmd/gomu/cmd/cli/new/template/proto.go b/cmd/gomu/generate/template/proto.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/proto.go rename to cmd/gomu/generate/template/proto.go diff --git a/cmd/gomu/cmd/cli/new/template/skaffold.go b/cmd/gomu/generate/template/skaffold.go similarity index 100% rename from cmd/gomu/cmd/cli/new/template/skaffold.go rename to cmd/gomu/generate/template/skaffold.go From 4a4b887b66eff115610f9569b6b200b8ea5d051d Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 10 Sep 2021 12:25:10 +0200 Subject: [PATCH 2/7] Use text/template instead of html/template --- cmd/gomu/generate/files.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gomu/generate/files.go b/cmd/gomu/generate/files.go index cc5c015862..3b2b546669 100644 --- a/cmd/gomu/generate/files.go +++ b/cmd/gomu/generate/files.go @@ -1,10 +1,10 @@ package generate import ( - "html/template" "os" "path/filepath" "strings" + "text/template" ) type File struct { From fe16114a38f0373f0ca20df7fc4944bb7a8fc698 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 10 Sep 2021 13:02:33 +0200 Subject: [PATCH 3/7] Make config variables more consistent --- cmd/gomu/cmd/cli/new/new.go | 4 ++-- cmd/gomu/generate/config.go | 6 +++--- cmd/gomu/generate/template/docker.go | 6 +++--- cmd/gomu/generate/template/gitignore.go | 2 +- cmd/gomu/generate/template/handler.go | 24 ++++++++++++------------ cmd/gomu/generate/template/kubernetes.go | 16 ++++++++-------- cmd/gomu/generate/template/main.go | 18 +++++++++--------- cmd/gomu/generate/template/makefile.go | 6 +++--- cmd/gomu/generate/template/module.go | 4 ++-- cmd/gomu/generate/template/proto.go | 12 ++++++------ cmd/gomu/generate/template/skaffold.go | 4 ++-- 11 files changed, 51 insertions(+), 51 deletions(-) diff --git a/cmd/gomu/cmd/cli/new/new.go b/cmd/gomu/cmd/cli/new/new.go index 8fbf5aeec4..4afa3caef1 100644 --- a/cmd/gomu/cmd/cli/new/new.go +++ b/cmd/gomu/cmd/cli/new/new.go @@ -130,9 +130,9 @@ func createProject(ctx *cli.Context, pt string) error { } c := generate.Config{ - Alias: name, - Dir: dir, + Service: name, Vendor: vendor, + Dir: dir, Client: pt == "client", Jaeger: ctx.Bool("jaeger"), Skaffold: ctx.Bool("skaffold"), diff --git a/cmd/gomu/generate/config.go b/cmd/gomu/generate/config.go index e3d76dbb1b..8705374da5 100644 --- a/cmd/gomu/generate/config.go +++ b/cmd/gomu/generate/config.go @@ -1,10 +1,10 @@ package generate type Config struct { - Alias string - Comments []string - Dir string + Service string Vendor string + Dir string + Comments []string Client bool Jaeger bool Skaffold bool diff --git a/cmd/gomu/generate/template/docker.go b/cmd/gomu/generate/template/docker.go index d51cf7f9eb..d68267fdd7 100644 --- a/cmd/gomu/generate/template/docker.go +++ b/cmd/gomu/generate/template/docker.go @@ -3,7 +3,7 @@ package template // Dockerfile is the Dockerfile template used for new projects. var Dockerfile = `FROM golang:alpine AS builder ENV CGO_ENABLED=0 GOOS=linux -WORKDIR /go/src/{{.Alias}} +WORKDIR /go/src/{{.Service}}{{if .Client}}-client{{end}} RUN apk --update --no-cache add ca-certificates gcc libtool make musl-dev protoc COPY {{if not .Client}}Makefile {{end}}go.mod go.sum ./ RUN {{if not .Client}}make init && {{end}}go mod download @@ -12,8 +12,8 @@ RUN make {{if not .Client}}proto {{end}}tidy build FROM scratch COPY --from=builder /etc/ssl/certs /etc/ssl/certs -COPY --from=builder /go/src/{{.Alias}}/{{.Alias}} /{{.Alias}} -ENTRYPOINT ["/{{.Alias}}"] +COPY --from=builder /go/src/{{.Service}}{{if .Client}}-client{{end}}/{{.Service}}{{if .Client}}-client{{end}} /{{.Service}}{{if .Client}}-client{{end}} +ENTRYPOINT ["/{{.Service}}{{if .Client}}-client{{end}}"] CMD [] ` diff --git a/cmd/gomu/generate/template/gitignore.go b/cmd/gomu/generate/template/gitignore.go index 130b812c05..1b6d7416c2 100644 --- a/cmd/gomu/generate/template/gitignore.go +++ b/cmd/gomu/generate/template/gitignore.go @@ -2,5 +2,5 @@ package template // GitIgnore is the .gitignore template used for new projects. var GitIgnore = `# don't commit the service binary to vcs -{{.Alias}} +{{.Service}}{{if .Client}}-client{{end}} ` diff --git a/cmd/gomu/generate/template/handler.go b/cmd/gomu/generate/template/handler.go index fd064d0966..7e5b760be6 100644 --- a/cmd/gomu/generate/template/handler.go +++ b/cmd/gomu/generate/template/handler.go @@ -8,13 +8,13 @@ import ( log "github.com/asim/go-micro/v3/logger" - pb "{{.Vendor}}{{.Dir}}/proto" + pb "{{.Vendor}}{{.Service}}/proto" ) -type {{title .Alias}} struct{} +type {{title .Service}} struct{} -func (e *{{title .Alias}}) Call(ctx context.Context, req *pb.CallRequest, rsp *pb.CallResponse) error { - log.Infof("Received {{title .Alias}}.Call request: %v", req) +func (e *{{title .Service}}) Call(ctx context.Context, req *pb.CallRequest, rsp *pb.CallResponse) error { + log.Infof("Received {{title .Service}}.Call request: %v", req) rsp.Msg = "Hello " + req.Name return nil } @@ -30,18 +30,18 @@ import ( log "github.com/asim/go-micro/v3/logger" - pb "{{.Vendor}}{{.Dir}}/proto" + pb "{{.Vendor}}{{.Service}}/proto" ) -type {{title .Alias}} struct{} +type {{title .Service}} struct{} -func (e *{{title .Alias}}) Call(ctx context.Context, req *pb.CallRequest, rsp *pb.CallResponse) error { - log.Infof("Received {{title .Alias}}.Call request: %v", req) +func (e *{{title .Service}}) Call(ctx context.Context, req *pb.CallRequest, rsp *pb.CallResponse) error { + log.Infof("Received {{title .Service}}.Call request: %v", req) rsp.Msg = "Hello " + req.Name return nil } -func (e *{{title .Alias}}) ClientStream(ctx context.Context, stream pb.{{title .Alias}}_ClientStreamStream) error { +func (e *{{title .Service}}) ClientStream(ctx context.Context, stream pb.{{title .Service}}_ClientStreamStream) error { var count int64 for { req, err := stream.Recv() @@ -57,8 +57,8 @@ func (e *{{title .Alias}}) ClientStream(ctx context.Context, stream pb.{{title . } } -func (e *{{title .Alias}}) ServerStream(ctx context.Context, req *pb.ServerStreamRequest, stream pb.{{title .Alias}}_ServerStreamStream) error { - log.Infof("Received {{title .Alias}}.ServerStream request: %v", req) +func (e *{{title .Service}}) ServerStream(ctx context.Context, req *pb.ServerStreamRequest, stream pb.{{title .Service}}_ServerStreamStream) error { + log.Infof("Received {{title .Service}}.ServerStream request: %v", req) for i := 0; i < int(req.Count); i++ { log.Infof("Sending %d", i) if err := stream.Send(&pb.ServerStreamResponse{ @@ -71,7 +71,7 @@ func (e *{{title .Alias}}) ServerStream(ctx context.Context, req *pb.ServerStrea return nil } -func (e *{{title .Alias}}) BidiStream(ctx context.Context, stream pb.{{title .Alias}}_BidiStreamStream) error { +func (e *{{title .Service}}) BidiStream(ctx context.Context, stream pb.{{title .Service}}_BidiStreamStream) error { for { req, err := stream.Recv() if err == io.EOF { diff --git a/cmd/gomu/generate/template/kubernetes.go b/cmd/gomu/generate/template/kubernetes.go index 9da95caefa..7ee45c11fb 100644 --- a/cmd/gomu/generate/template/kubernetes.go +++ b/cmd/gomu/generate/template/kubernetes.go @@ -7,7 +7,7 @@ var KubernetesEnv = `--- apiVersion: v1 kind: ConfigMap metadata: - name: {{.Dir}}-env + name: {{.Service}}{{if .Client}}-client{{end}}-env data: MICRO_REGISTRY: kubernetes ` @@ -56,23 +56,23 @@ var KubernetesDeployment = `--- apiVersion: apps/v1 kind: Deployment metadata: - name: {{.Dir}} + name: {{.Service}}{{if .Client}}-client{{end}} labels: - app: {{.Dir}} + app: {{.Service}}{{if .Client}}-client{{end}} spec: replicas: 1 selector: matchLabels: - app: {{.Dir}} + app: {{.Service}}{{if .Client}}-client{{end}} template: metadata: labels: - app: {{.Dir}} + app: {{.Service}}{{if .Client}}-client{{end}} spec: containers: - - name: {{.Dir}} - image: {{.Dir}}:latest + - name: {{.Service}}{{if .Client}}-client{{end}} + image: {{.Service}}{{if .Client}}-client{{end}}:latest envFrom: - configMapRef: - name: {{.Dir}}-env + name: {{.Service}}{{if .Client}}-client{{end}}-env ` diff --git a/cmd/gomu/generate/template/main.go b/cmd/gomu/generate/template/main.go index 07db28aa43..45eb09e95c 100644 --- a/cmd/gomu/generate/template/main.go +++ b/cmd/gomu/generate/template/main.go @@ -7,14 +7,14 @@ import ( "context" "time" - pb "{{.Vendor}}{{lower .Alias}}/proto" + pb "{{.Vendor}}{{lower .Service}}/proto" "github.com/asim/go-micro/v3" log "github.com/asim/go-micro/v3/logger" ) var ( - service = "{{lower .Alias}}" + service = "{{lower .Service}}" version = "latest" ) @@ -44,7 +44,7 @@ func main() { var MainFNC = `package main import ( - "{{.Vendor}}{{.Dir}}/handler" + "{{.Vendor}}{{.Service}}/handler" {{if .Jaeger}} ot "github.com/asim/go-micro/plugins/wrapper/trace/opentracing/v3" {{end}} "github.com/asim/go-micro/v3" @@ -54,7 +54,7 @@ import ( ) var ( - service = "{{lower .Alias}}" + service = "{{lower .Service}}" version = "latest" ) @@ -82,7 +82,7 @@ func main() { fnc.Init() // Handle function - fnc.Handle(new(handler.{{title .Alias}})) + fnc.Handle(new(handler.{{title .Service}})) // Run function if err := fnc.Run(); err != nil { @@ -95,8 +95,8 @@ func main() { var MainSRV = `package main import ( - "{{.Vendor}}{{.Dir}}/handler" - pb "{{.Vendor}}{{.Dir}}/proto" + "{{.Vendor}}{{.Service}}/handler" + pb "{{.Vendor}}{{.Service}}/proto" {{if .Jaeger}} ot "github.com/asim/go-micro/plugins/wrapper/trace/opentracing/v3" {{end}} "github.com/asim/go-micro/v3" @@ -106,7 +106,7 @@ import ( ) var ( - service = "{{lower .Alias}}" + service = "{{lower .Service}}" version = "latest" ) @@ -134,7 +134,7 @@ func main() { srv.Init() // Register handler - pb.Register{{title .Alias}}Handler(srv.Server(), new(handler.{{title .Alias}})) + pb.Register{{title .Service}}Handler(srv.Server(), new(handler.{{title .Service}})) // Run service if err := srv.Run(); err != nil { diff --git a/cmd/gomu/generate/template/makefile.go b/cmd/gomu/generate/template/makefile.go index 26508e71fb..138adb2bda 100644 --- a/cmd/gomu/generate/template/makefile.go +++ b/cmd/gomu/generate/template/makefile.go @@ -11,7 +11,7 @@ init: .PHONY: proto proto: - @protoc --proto_path=. --micro_out=. --go_out=:. proto/{{.Alias}}.proto + @protoc --proto_path=. --micro_out=. --go_out=:. proto/{{.Service}}.proto .PHONY: tidy tidy: @@ -19,7 +19,7 @@ tidy: .PHONY: build build: - @go build -o {{.Alias}} *.go + @go build -o {{.Service}}{{if .Client}}-client{{end}} *.go .PHONY: test test: @@ -27,5 +27,5 @@ test: .PHONY: docker docker: - @docker build -t {{.Alias}}:latest . + @docker build -t {{.Service}}{{if .Client}}-client{{end}}:latest . ` diff --git a/cmd/gomu/generate/template/module.go b/cmd/gomu/generate/template/module.go index f84e46ad8e..68aecedfa9 100644 --- a/cmd/gomu/generate/template/module.go +++ b/cmd/gomu/generate/template/module.go @@ -1,7 +1,7 @@ package template // Module is the go.mod template used for new projects. -var Module = `module {{.Vendor}}{{.Dir}} +var Module = `module {{.Vendor}}{{.Service}}{{if .Client}}-client{{end}} go 1.16 @@ -13,5 +13,5 @@ require ( // see https://github.com/etcd-io/etcd/issues/11154 and https://github.com/etcd-io/etcd/issues/11931. replace google.golang.org/grpc => google.golang.org/grpc v1.26.0{{if .Vendor}}{{if not .Skaffold}} -replace {{.Vendor}}{{lower .Alias}} => ../{{lower .Alias}}{{end}}{{end}} +replace {{.Vendor}}{{lower .Service}} => ../{{lower .Service}}{{end}}{{end}} ` diff --git a/cmd/gomu/generate/template/proto.go b/cmd/gomu/generate/template/proto.go index d1ef11bbeb..58eefc19ff 100644 --- a/cmd/gomu/generate/template/proto.go +++ b/cmd/gomu/generate/template/proto.go @@ -3,11 +3,11 @@ package template // ProtoFNC is the .proto file template used for new function projects. var ProtoFNC = `syntax = "proto3"; -package {{dehyphen .Alias}}; +package {{dehyphen .Service}}; -option go_package = "./proto;{{dehyphen .Alias}}"; +option go_package = "./proto;{{dehyphen .Service}}"; -service {{title .Alias}} { +service {{title .Service}} { rpc Call(CallRequest) returns (CallResponse) {} } @@ -23,11 +23,11 @@ message CallResponse { // ProtoSRV is the .proto file template used for new service projects. var ProtoSRV = `syntax = "proto3"; -package {{dehyphen .Alias}}; +package {{dehyphen .Service}}; -option go_package = "./proto;{{dehyphen .Alias}}"; +option go_package = "./proto;{{dehyphen .Service}}"; -service {{title .Alias}} { +service {{title .Service}} { rpc Call(CallRequest) returns (CallResponse) {} rpc ClientStream(stream ClientStreamRequest) returns (ClientStreamResponse) {} rpc ServerStream(ServerStreamRequest) returns (stream ServerStreamResponse) {} diff --git a/cmd/gomu/generate/template/skaffold.go b/cmd/gomu/generate/template/skaffold.go index c414bcb0ef..c5a93c6a62 100644 --- a/cmd/gomu/generate/template/skaffold.go +++ b/cmd/gomu/generate/template/skaffold.go @@ -6,10 +6,10 @@ var SkaffoldCFG = `--- apiVersion: skaffold/v2beta21 kind: Config metadata: - name: {{.Dir}} + name: {{.Service}}{{if .Client}}-client{{end}} build: artifacts: - - image: {{.Dir}} + - image: {{.Service}}{{if .Client}}-client{{end}} deploy: kubectl: manifests: From 87a8ad0e60ebe3138bfe620890e26587194e8ca3 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 10 Sep 2021 13:43:21 +0200 Subject: [PATCH 4/7] Combine generate files and print comments there --- cmd/gomu/cmd/cli/new/new.go | 12 +----------- cmd/gomu/generate/config.go | 11 ----------- cmd/gomu/generate/{files.go => generate.go} | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 22 deletions(-) delete mode 100644 cmd/gomu/generate/config.go rename cmd/gomu/generate/{files.go => generate.go} (80%) diff --git a/cmd/gomu/cmd/cli/new/new.go b/cmd/gomu/cmd/cli/new/new.go index 4afa3caef1..78b8fdbf51 100644 --- a/cmd/gomu/cmd/cli/new/new.go +++ b/cmd/gomu/cmd/cli/new/new.go @@ -144,7 +144,7 @@ func createProject(ctx *cli.Context, pt string) error { c.Comments = protoComments(name, dir) } - return create(files, c) + return generate.Create(files, c) } func clientComments(name, dir string) []string { @@ -168,16 +168,6 @@ func protoComments(name, dir string) []string { } } -func create(files []generate.File, c generate.Config) error { - generate.Create(files, c) - - for _, comment := range c.Comments { - fmt.Println(comment) - } - - return nil -} - func getNameAndVendor(s string) (string, string) { var n string var v string diff --git a/cmd/gomu/generate/config.go b/cmd/gomu/generate/config.go deleted file mode 100644 index 8705374da5..0000000000 --- a/cmd/gomu/generate/config.go +++ /dev/null @@ -1,11 +0,0 @@ -package generate - -type Config struct { - Service string - Vendor string - Dir string - Comments []string - Client bool - Jaeger bool - Skaffold bool -} diff --git a/cmd/gomu/generate/files.go b/cmd/gomu/generate/generate.go similarity index 80% rename from cmd/gomu/generate/files.go rename to cmd/gomu/generate/generate.go index 3b2b546669..c261ea982b 100644 --- a/cmd/gomu/generate/files.go +++ b/cmd/gomu/generate/generate.go @@ -1,12 +1,23 @@ package generate import ( + "fmt" "os" "path/filepath" "strings" "text/template" ) +type Config struct { + Service string + Vendor string + Dir string + Comments []string + Client bool + Jaeger bool + Skaffold bool +} + type File struct { Path string Template string @@ -48,5 +59,9 @@ func Create(files []File, c Config) error { } } + for _, comment := range c.Comments { + fmt.Println(comment) + } + return nil } From 964f3fd57bde0c23642e14201dc7bfd67bc71315 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 10 Sep 2021 13:43:37 +0200 Subject: [PATCH 5/7] Add gomu generate command --- cmd/gomu/cmd/cli/cli.go | 1 + cmd/gomu/cmd/cli/generate/generate.go | 94 +++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 cmd/gomu/cmd/cli/generate/generate.go diff --git a/cmd/gomu/cmd/cli/cli.go b/cmd/gomu/cmd/cli/cli.go index 976d842fce..cf11632481 100644 --- a/cmd/gomu/cmd/cli/cli.go +++ b/cmd/gomu/cmd/cli/cli.go @@ -3,6 +3,7 @@ package cli import ( _ "github.com/asim/go-micro/cmd/gomu/cmd/cli/call" _ "github.com/asim/go-micro/cmd/gomu/cmd/cli/describe" + _ "github.com/asim/go-micro/cmd/gomu/cmd/cli/generate" _ "github.com/asim/go-micro/cmd/gomu/cmd/cli/new" _ "github.com/asim/go-micro/cmd/gomu/cmd/cli/run" _ "github.com/asim/go-micro/cmd/gomu/cmd/cli/services" diff --git a/cmd/gomu/cmd/cli/generate/generate.go b/cmd/gomu/cmd/cli/generate/generate.go new file mode 100644 index 0000000000..699d9539bf --- /dev/null +++ b/cmd/gomu/cmd/cli/generate/generate.go @@ -0,0 +1,94 @@ +package generate + +import ( + "bufio" + "os" + "strings" + + "github.com/asim/go-micro/cmd/gomu/cmd" + "github.com/asim/go-micro/cmd/gomu/generate" + tmpl "github.com/asim/go-micro/cmd/gomu/generate/template" + "github.com/urfave/cli/v2" +) + +func init() { + cmd.Register(&cli.Command{ + Name: "generate", + Usage: "Generate project template files after the fact", + Subcommands: []*cli.Command{ + { + Name: "skaffold", + Usage: "Generate Skaffold project template files", + Action: Skaffold, + }, + }, + }) +} + +// Skaffold generates Skaffold project template files in the current directory. +// Exits on error. +func Skaffold(ctx *cli.Context) error { + dir, err := os.Getwd() + if err != nil { + return err + } + service := dir[strings.LastIndex(dir, "/")+1:] + + vendor, err := getServiceVendor(service) + if err != nil { + return err + } + + files := []generate.File{ + {".dockerignore", tmpl.DockerIgnore}, + {"go.mod", tmpl.Module}, + {"plugins.go", tmpl.Plugins}, + {"resources/clusterrole.yaml", tmpl.KubernetesClusterRole}, + {"resources/configmap.yaml", tmpl.KubernetesEnv}, + {"resources/deployment.yaml", tmpl.KubernetesDeployment}, + {"resources/rolebinding.yaml", tmpl.KubernetesRoleBinding}, + {"skaffold.yaml", tmpl.SkaffoldCFG}, + } + + c := generate.Config{ + Service: service, + Dir: ".", + Vendor: vendor, + Comments: []string{"skaffold project template files generated"}, + Client: strings.HasSuffix(service, "-client"), + Jaeger: false, + Skaffold: true, + } + + generate.Create(files, c) + + return nil +} + +func getServiceVendor(s string) (string, error) { + f, err := os.Open("go.mod") + if err != nil { + return "", err + } + defer f.Close() + + line := "" + scanner := bufio.NewScanner(f) + for scanner.Scan() { + if strings.HasPrefix(scanner.Text(), "module ") { + line = scanner.Text() + break + + } + } + if line == "" { + return "", nil + } + + module := line[strings.LastIndex(line, " ")+1:] + if module == s { + return "", nil + } + + return module[:strings.LastIndex(module, "/")] + "/", nil +} From 1528bd3b3f642c3d05f77b11cfc727b7989b073b Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 10 Sep 2021 14:11:07 +0200 Subject: [PATCH 6/7] Refactor project templating to file library --- cmd/gomu/cmd/cli/generate/generate.go | 28 ++++++----- cmd/gomu/cmd/cli/new/new.go | 48 +++++++++++------- cmd/gomu/file/file.go | 6 +++ .../generator/generator.go} | 41 +++++++++------- cmd/gomu/file/generator/options.go | 49 +++++++++++++++++++ .../{generate => file}/template/docker.go | 0 .../{generate => file}/template/gitignore.go | 0 .../{generate => file}/template/handler.go | 0 .../{generate => file}/template/kubernetes.go | 0 cmd/gomu/{generate => file}/template/main.go | 0 .../{generate => file}/template/makefile.go | 0 .../{generate => file}/template/module.go | 0 .../{generate => file}/template/plugins.go | 0 cmd/gomu/{generate => file}/template/proto.go | 0 .../{generate => file}/template/skaffold.go | 0 15 files changed, 123 insertions(+), 49 deletions(-) create mode 100644 cmd/gomu/file/file.go rename cmd/gomu/{generate/generate.go => file/generator/generator.go} (58%) create mode 100644 cmd/gomu/file/generator/options.go rename cmd/gomu/{generate => file}/template/docker.go (100%) rename cmd/gomu/{generate => file}/template/gitignore.go (100%) rename cmd/gomu/{generate => file}/template/handler.go (100%) rename cmd/gomu/{generate => file}/template/kubernetes.go (100%) rename cmd/gomu/{generate => file}/template/main.go (100%) rename cmd/gomu/{generate => file}/template/makefile.go (100%) rename cmd/gomu/{generate => file}/template/module.go (100%) rename cmd/gomu/{generate => file}/template/plugins.go (100%) rename cmd/gomu/{generate => file}/template/proto.go (100%) rename cmd/gomu/{generate => file}/template/skaffold.go (100%) diff --git a/cmd/gomu/cmd/cli/generate/generate.go b/cmd/gomu/cmd/cli/generate/generate.go index 699d9539bf..804ffd7503 100644 --- a/cmd/gomu/cmd/cli/generate/generate.go +++ b/cmd/gomu/cmd/cli/generate/generate.go @@ -2,12 +2,14 @@ package generate import ( "bufio" + "fmt" "os" "strings" "github.com/asim/go-micro/cmd/gomu/cmd" - "github.com/asim/go-micro/cmd/gomu/generate" - tmpl "github.com/asim/go-micro/cmd/gomu/generate/template" + "github.com/asim/go-micro/cmd/gomu/file" + "github.com/asim/go-micro/cmd/gomu/file/generator" + tmpl "github.com/asim/go-micro/cmd/gomu/file/template" "github.com/urfave/cli/v2" ) @@ -39,7 +41,15 @@ func Skaffold(ctx *cli.Context) error { return err } - files := []generate.File{ + g := generator.New( + generator.Service(service), + generator.Vendor(vendor), + generator.Directory("."), + generator.Client(strings.HasSuffix(service, "-client")), + generator.Skaffold(true), + ) + + files := []file.File{ {".dockerignore", tmpl.DockerIgnore}, {"go.mod", tmpl.Module}, {"plugins.go", tmpl.Plugins}, @@ -50,17 +60,11 @@ func Skaffold(ctx *cli.Context) error { {"skaffold.yaml", tmpl.SkaffoldCFG}, } - c := generate.Config{ - Service: service, - Dir: ".", - Vendor: vendor, - Comments: []string{"skaffold project template files generated"}, - Client: strings.HasSuffix(service, "-client"), - Jaeger: false, - Skaffold: true, + if err := g.Generate(files); err != nil { + return err } - generate.Create(files, c) + fmt.Println("skaffold project template files generated") return nil } diff --git a/cmd/gomu/cmd/cli/new/new.go b/cmd/gomu/cmd/cli/new/new.go index 78b8fdbf51..c6cab8f248 100644 --- a/cmd/gomu/cmd/cli/new/new.go +++ b/cmd/gomu/cmd/cli/new/new.go @@ -7,8 +7,9 @@ import ( "strings" "github.com/asim/go-micro/cmd/gomu/cmd" - "github.com/asim/go-micro/cmd/gomu/generate" - tmpl "github.com/asim/go-micro/cmd/gomu/generate/template" + "github.com/asim/go-micro/cmd/gomu/file" + "github.com/asim/go-micro/cmd/gomu/file/generator" + tmpl "github.com/asim/go-micro/cmd/gomu/file/template" "github.com/urfave/cli/v2" ) @@ -87,9 +88,20 @@ func createProject(ctx *cli.Context, pt string) error { return fmt.Errorf("%s already exists", dir) } + client := pt == "client" + fmt.Printf("creating %s %s\n", pt, name) - files := []generate.File{ + g := generator.New( + generator.Service(name), + generator.Vendor(vendor), + generator.Directory(dir), + generator.Client(client), + generator.Jaeger(ctx.Bool("jaeger")), + generator.Skaffold(ctx.Bool("skaffold")), + ) + + files := []file.File{ {".dockerignore", tmpl.DockerIgnore}, {".gitignore", tmpl.GitIgnore}, {"Dockerfile", tmpl.Dockerfile}, @@ -99,17 +111,17 @@ func createProject(ctx *cli.Context, pt string) error { switch pt { case "client": - files = append(files, []generate.File{ + files = append(files, []file.File{ {"main.go", tmpl.MainCLT}, }...) case "function": - files = append(files, []generate.File{ + files = append(files, []file.File{ {"handler/" + name + ".go", tmpl.HandlerFNC}, {"main.go", tmpl.MainFNC}, {"proto/" + name + ".proto", tmpl.ProtoFNC}, }...) case "service": - files = append(files, []generate.File{ + files = append(files, []file.File{ {"handler/" + name + ".go", tmpl.HandlerSRV}, {"main.go", tmpl.MainSRV}, {"proto/" + name + ".proto", tmpl.ProtoSRV}, @@ -119,7 +131,7 @@ func createProject(ctx *cli.Context, pt string) error { } if ctx.Bool("skaffold") { - files = append(files, []generate.File{ + files = append(files, []file.File{ {"plugins.go", tmpl.Plugins}, {"resources/clusterrole.yaml", tmpl.KubernetesClusterRole}, {"resources/configmap.yaml", tmpl.KubernetesEnv}, @@ -129,22 +141,22 @@ func createProject(ctx *cli.Context, pt string) error { }...) } - c := generate.Config{ - Service: name, - Vendor: vendor, - Dir: dir, - Client: pt == "client", - Jaeger: ctx.Bool("jaeger"), - Skaffold: ctx.Bool("skaffold"), + if err := g.Generate(files); err != nil { + return err } - if pt == "client" { - c.Comments = clientComments(name, dir) + var comments []string + if client { + comments = clientComments(name, dir) } else { - c.Comments = protoComments(name, dir) + comments = protoComments(name, dir) + } + + for _, comment := range comments { + fmt.Println(comment) } - return generate.Create(files, c) + return nil } func clientComments(name, dir string) []string { diff --git a/cmd/gomu/file/file.go b/cmd/gomu/file/file.go new file mode 100644 index 0000000000..815b9c96f2 --- /dev/null +++ b/cmd/gomu/file/file.go @@ -0,0 +1,6 @@ +package file + +type File struct { + Path string + Template string +} diff --git a/cmd/gomu/generate/generate.go b/cmd/gomu/file/generator/generator.go similarity index 58% rename from cmd/gomu/generate/generate.go rename to cmd/gomu/file/generator/generator.go index c261ea982b..11f6b3d51e 100644 --- a/cmd/gomu/generate/generate.go +++ b/cmd/gomu/file/generator/generator.go @@ -1,31 +1,26 @@ -package generate +package generator import ( - "fmt" "os" "path/filepath" "strings" "text/template" + + "github.com/asim/go-micro/cmd/gomu/file" ) -type Config struct { - Service string - Vendor string - Dir string - Comments []string - Client bool - Jaeger bool - Skaffold bool +type Generator interface { + Generate([]file.File) error } -type File struct { - Path string - Template string +type generator struct { + opts Options } -func Create(files []File, c Config) error { +// Generate generates project template files. +func (g *generator) Generate(files []file.File) error { for _, file := range files { - fp := filepath.Join(c.Dir, file.Path) + fp := filepath.Join(g.opts.Directory, file.Path) dir := filepath.Dir(fp) if _, err := os.Stat(dir); os.IsNotExist(err) { @@ -53,15 +48,23 @@ func Create(files []File, c Config) error { return err } - err = t.Execute(f, c) + err = t.Execute(f, g.opts) if err != nil { return err } } - for _, comment := range c.Comments { - fmt.Println(comment) + return nil +} + +// New returns a new generator struct. +func New(opts ...Option) Generator { + var options Options + for _, o := range opts { + o(&options) } - return nil + return &generator{ + opts: options, + } } diff --git a/cmd/gomu/file/generator/options.go b/cmd/gomu/file/generator/options.go new file mode 100644 index 0000000000..7e083946d0 --- /dev/null +++ b/cmd/gomu/file/generator/options.go @@ -0,0 +1,49 @@ +package generator + +type Options struct { + Service string + Vendor string + Directory string + + Client bool + Jaeger bool + Skaffold bool +} + +type Option func(o *Options) + +func Service(s string) Option { + return func(o *Options) { + o.Service = s + } +} + +func Vendor(v string) Option { + return func(o *Options) { + o.Vendor = v + } +} + +func Directory(d string) Option { + return func(o *Options) { + o.Directory = d + } +} + +func Client(c bool) Option { + return func(o *Options) { + o.Client = c + } +} + +func Jaeger(j bool) Option { + return func(o *Options) { + o.Jaeger = j + } +} + +func Skaffold(s bool) Option { + return func(o *Options) { + o.Skaffold = s + } +} diff --git a/cmd/gomu/generate/template/docker.go b/cmd/gomu/file/template/docker.go similarity index 100% rename from cmd/gomu/generate/template/docker.go rename to cmd/gomu/file/template/docker.go diff --git a/cmd/gomu/generate/template/gitignore.go b/cmd/gomu/file/template/gitignore.go similarity index 100% rename from cmd/gomu/generate/template/gitignore.go rename to cmd/gomu/file/template/gitignore.go diff --git a/cmd/gomu/generate/template/handler.go b/cmd/gomu/file/template/handler.go similarity index 100% rename from cmd/gomu/generate/template/handler.go rename to cmd/gomu/file/template/handler.go diff --git a/cmd/gomu/generate/template/kubernetes.go b/cmd/gomu/file/template/kubernetes.go similarity index 100% rename from cmd/gomu/generate/template/kubernetes.go rename to cmd/gomu/file/template/kubernetes.go diff --git a/cmd/gomu/generate/template/main.go b/cmd/gomu/file/template/main.go similarity index 100% rename from cmd/gomu/generate/template/main.go rename to cmd/gomu/file/template/main.go diff --git a/cmd/gomu/generate/template/makefile.go b/cmd/gomu/file/template/makefile.go similarity index 100% rename from cmd/gomu/generate/template/makefile.go rename to cmd/gomu/file/template/makefile.go diff --git a/cmd/gomu/generate/template/module.go b/cmd/gomu/file/template/module.go similarity index 100% rename from cmd/gomu/generate/template/module.go rename to cmd/gomu/file/template/module.go diff --git a/cmd/gomu/generate/template/plugins.go b/cmd/gomu/file/template/plugins.go similarity index 100% rename from cmd/gomu/generate/template/plugins.go rename to cmd/gomu/file/template/plugins.go diff --git a/cmd/gomu/generate/template/proto.go b/cmd/gomu/file/template/proto.go similarity index 100% rename from cmd/gomu/generate/template/proto.go rename to cmd/gomu/file/template/proto.go diff --git a/cmd/gomu/generate/template/skaffold.go b/cmd/gomu/file/template/skaffold.go similarity index 100% rename from cmd/gomu/generate/template/skaffold.go rename to cmd/gomu/file/template/skaffold.go From 4a733d1697d5d81f2c261aea748ee25cfc2be684 Mon Sep 17 00:00:00 2001 From: Niek den Breeje Date: Fri, 10 Sep 2021 14:17:33 +0200 Subject: [PATCH 7/7] Determine client earlier --- cmd/gomu/cmd/cli/new/new.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/gomu/cmd/cli/new/new.go b/cmd/gomu/cmd/cli/new/new.go index c6cab8f248..55ac12c090 100644 --- a/cmd/gomu/cmd/cli/new/new.go +++ b/cmd/gomu/cmd/cli/new/new.go @@ -72,10 +72,11 @@ func createProject(ctx *cli.Context, pt string) error { return cli.ShowSubcommandHelp(ctx) } + client := pt == "client" name, vendor := getNameAndVendor(arg) dir := name - if pt == "client" { + if client { dir += "-client" } @@ -88,8 +89,6 @@ func createProject(ctx *cli.Context, pt string) error { return fmt.Errorf("%s already exists", dir) } - client := pt == "client" - fmt.Printf("creating %s %s\n", pt, name) g := generator.New(