Skip to content

Commit 2498f16

Browse files
committed
init
0 parents  commit 2498f16

File tree

495 files changed

+54538
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

495 files changed

+54538
-0
lines changed

.dockerignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
test/
2+
.dockerignore
3+
.go-version
4+
Dockerfile
5+
goctl
6+
Makefile
7+
readme.md
8+
readme-cn.md

.idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Dockerfile

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
FROM golang:alpine AS builder
2+
3+
LABEL stage=gobuilder
4+
5+
ENV CGO_ENABLED=0
6+
ENV GOPROXY=https://goproxy.cn,direct
7+
8+
RUN apk update --no-cache && apk add --no-cache tzdata
9+
RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
10+
RUN go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
11+
RUN addgroup -g 1000 -S app && adduser -u 1000 -S app -G app
12+
13+
WORKDIR /build
14+
15+
COPY . .
16+
RUN go mod download
17+
RUN go build -ldflags="-s -w" -o /app/goctl ./goctl.go
18+
19+
20+
FROM golang:alpine
21+
22+
RUN apk update --no-cache && apk add --no-cache protoc
23+
24+
COPY --from=builder /etc/passwd /etc/group /etc/
25+
COPY --from=builder /usr/share/zoneinfo/ /usr/share/zoneinfo/
26+
COPY --from=builder --chown=1000:1000 /go/bin/protoc-gen-go* /app/goctl /usr/local/bin/
27+
ENV TZ=Asia/Shanghai
28+
29+
WORKDIR /app
30+
USER app
31+
32+
LABEL org.opencontainers.image.authors="Kevin Wan"
33+
LABEL org.opencontainers.image.base.name="docker.io/library/golang:alpine"
34+
LABEL org.opencontainers.image.description="A cloud-native Go microservices framework with cli tool for productivity."
35+
LABEL org.opencontainers.image.licenses="MIT"
36+
LABEL org.opencontainers.image.source="https://github.com/zeromicro/go-zero"
37+
LABEL org.opencontainers.image.title="goctl (cli)"
38+
39+
ENTRYPOINT ["/usr/local/bin/goctl"]

Makefile

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
build:
2+
go build -ldflags="-s -w" goctl.go
3+
$(if $(shell command -v upx || which upx), upx goctl)
4+
5+
mac:
6+
GOOS=darwin go build -ldflags="-s -w" -o goctl-darwin goctl.go
7+
$(if $(shell command -v upx || which upx), upx goctl-darwin)
8+
9+
win:
10+
GOOS=windows go build -ldflags="-s -w" -o goctl.exe goctl.go
11+
$(if $(shell command -v upx || which upx), upx goctl.exe)
12+
13+
linux:
14+
GOOS=linux go build -ldflags="-s -w" -o goctl-linux goctl.go
15+
$(if $(shell command -v upx || which upx), upx goctl-linux)
16+
17+
image:
18+
docker build --rm --platform linux/amd64 -t kevinwan/goctl:$(version) .
19+
docker tag kevinwan/goctl:$(version) kevinwan/goctl:latest
20+
docker push kevinwan/goctl:$(version)
21+
docker push kevinwan/goctl:latest
22+
docker build --rm --platform linux/arm64 -t kevinwan/goctl:$(version)-arm64 .
23+
docker tag kevinwan/goctl:$(version)-arm64 kevinwan/goctl:latest-arm64
24+
docker push kevinwan/goctl:$(version)-arm64
25+
docker push kevinwan/goctl:latest-arm64

api/apigen/api.tpl

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
syntax = "v1"
2+
3+
info (
4+
title: // TODO: add title
5+
desc: // TODO: add description
6+
author: "{{.gitUser}}"
7+
email: "{{.gitEmail}}"
8+
)
9+
10+
type request {
11+
// TODO: add members here and delete this comment
12+
}
13+
14+
type response {
15+
// TODO: add members here and delete this comment
16+
}
17+
18+
service {{.serviceName}} {
19+
@handler GetUser // TODO: set handler name and delete this comment
20+
get /users/id/:userId(request) returns(response)
21+
22+
@handler CreateUser // TODO: set handler name and delete this comment
23+
post /users/create(request)
24+
}

api/apigen/gen.go

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package apigen
2+
3+
import (
4+
_ "embed"
5+
"errors"
6+
"fmt"
7+
"html/template"
8+
"path/filepath"
9+
"strings"
10+
11+
"github.com/gookit/color"
12+
"github.com/spf13/cobra"
13+
"github.com/zeromicro/go-zero/tools/goctl/util"
14+
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
15+
)
16+
17+
//go:embed api.tpl
18+
var apiTemplate string
19+
20+
var (
21+
// VarStringOutput describes the output.
22+
VarStringOutput string
23+
// VarStringHome describes the goctl home.
24+
VarStringHome string
25+
// VarStringRemote describes the remote git repository.
26+
VarStringRemote string
27+
// VarStringBranch describes the git branch.
28+
VarStringBranch string
29+
)
30+
31+
// CreateApiTemplate create api template file
32+
func CreateApiTemplate(_ *cobra.Command, _ []string) error {
33+
apiFile := VarStringOutput
34+
if len(apiFile) == 0 {
35+
return errors.New("missing -o")
36+
}
37+
38+
fp, err := pathx.CreateIfNotExist(apiFile)
39+
if err != nil {
40+
return err
41+
}
42+
defer fp.Close()
43+
44+
if len(VarStringRemote) > 0 {
45+
repo, _ := util.CloneIntoGitHome(VarStringRemote, VarStringBranch)
46+
if len(repo) > 0 {
47+
VarStringHome = repo
48+
}
49+
}
50+
51+
if len(VarStringHome) > 0 {
52+
pathx.RegisterGoctlHome(VarStringHome)
53+
}
54+
55+
text, err := pathx.LoadTemplate(category, apiTemplateFile, apiTemplate)
56+
if err != nil {
57+
return err
58+
}
59+
60+
baseName := pathx.FileNameWithoutExt(filepath.Base(apiFile))
61+
if strings.HasSuffix(strings.ToLower(baseName), "-api") {
62+
baseName = baseName[:len(baseName)-4]
63+
} else if strings.HasSuffix(strings.ToLower(baseName), "api") {
64+
baseName = baseName[:len(baseName)-3]
65+
}
66+
67+
t := template.Must(template.New("etcTemplate").Parse(text))
68+
if err := t.Execute(fp, map[string]string{
69+
"gitUser": getGitName(),
70+
"gitEmail": getGitEmail(),
71+
"serviceName": baseName + "-api",
72+
}); err != nil {
73+
return err
74+
}
75+
76+
fmt.Println(color.Green.Render("Done."))
77+
return nil
78+
}

api/apigen/template.go

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package apigen
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
7+
)
8+
9+
const (
10+
category = "api"
11+
apiTemplateFile = "template.tpl"
12+
)
13+
14+
var templates = map[string]string{
15+
apiTemplateFile: apiTemplate,
16+
}
17+
18+
// Category returns the category of the api files.
19+
func Category() string {
20+
return category
21+
}
22+
23+
// Clean cleans the generated deployment files.
24+
func Clean() error {
25+
return pathx.Clean(category)
26+
}
27+
28+
// GenTemplates generates api template files.
29+
func GenTemplates() error {
30+
return pathx.InitTemplates(category, templates)
31+
}
32+
33+
// RevertTemplate reverts the given template file to the default value.
34+
func RevertTemplate(name string) error {
35+
content, ok := templates[name]
36+
if !ok {
37+
return fmt.Errorf("%s: no such file name", name)
38+
}
39+
return pathx.CreateTemplate(category, name, content)
40+
}
41+
42+
// Update updates the template files to the templates built in current goctl.
43+
func Update() error {
44+
err := Clean()
45+
if err != nil {
46+
return err
47+
}
48+
49+
return pathx.InitTemplates(category, templates)
50+
}

api/apigen/util.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package apigen
2+
3+
import (
4+
"os/exec"
5+
"strings"
6+
)
7+
8+
func getGitName() string {
9+
cmd := exec.Command("git", "config", "user.name")
10+
out, err := cmd.CombinedOutput()
11+
if err != nil {
12+
return ""
13+
}
14+
15+
return strings.TrimSpace(string(out))
16+
}
17+
18+
func getGitEmail() string {
19+
cmd := exec.Command("git", "config", "user.email")
20+
out, err := cmd.CombinedOutput()
21+
if err != nil {
22+
return ""
23+
}
24+
25+
return strings.TrimSpace(string(out))
26+
}

api/cmd.go

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package api
2+
3+
import (
4+
"github.com/spf13/cobra"
5+
"github.com/zeromicro/go-zero/tools/goctl/api/apigen"
6+
"github.com/zeromicro/go-zero/tools/goctl/api/dartgen"
7+
"github.com/zeromicro/go-zero/tools/goctl/api/docgen"
8+
"github.com/zeromicro/go-zero/tools/goctl/api/format"
9+
"github.com/zeromicro/go-zero/tools/goctl/api/gogen"
10+
"github.com/zeromicro/go-zero/tools/goctl/api/javagen"
11+
"github.com/zeromicro/go-zero/tools/goctl/api/ktgen"
12+
"github.com/zeromicro/go-zero/tools/goctl/api/new"
13+
"github.com/zeromicro/go-zero/tools/goctl/api/tsgen"
14+
"github.com/zeromicro/go-zero/tools/goctl/api/validate"
15+
"github.com/zeromicro/go-zero/tools/goctl/config"
16+
"github.com/zeromicro/go-zero/tools/goctl/internal/cobrax"
17+
"github.com/zeromicro/go-zero/tools/goctl/plugin"
18+
)
19+
20+
var (
21+
// Cmd describes an api command.
22+
Cmd = cobrax.NewCommand("api", cobrax.WithRunE(apigen.CreateApiTemplate))
23+
dartCmd = cobrax.NewCommand("dart", cobrax.WithRunE(dartgen.DartCommand))
24+
docCmd = cobrax.NewCommand("doc", cobrax.WithRunE(docgen.DocCommand))
25+
formatCmd = cobrax.NewCommand("format", cobrax.WithRunE(format.GoFormatApi))
26+
goCmd = cobrax.NewCommand("go", cobrax.WithRunE(gogen.GoCommand))
27+
newCmd = cobrax.NewCommand("new", cobrax.WithRunE(new.CreateServiceCommand),
28+
cobrax.WithArgs(cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs)))
29+
validateCmd = cobrax.NewCommand("validate", cobrax.WithRunE(validate.GoValidateApi))
30+
javaCmd = cobrax.NewCommand("java", cobrax.WithRunE(javagen.JavaCommand), cobrax.WithHidden())
31+
ktCmd = cobrax.NewCommand("kt", cobrax.WithRunE(ktgen.KtCommand))
32+
pluginCmd = cobrax.NewCommand("plugin", cobrax.WithRunE(plugin.PluginCommand))
33+
tsCmd = cobrax.NewCommand("ts", cobrax.WithRunE(tsgen.TsCommand))
34+
)
35+
36+
func init() {
37+
var (
38+
apiCmdFlags = Cmd.Flags()
39+
dartCmdFlags = dartCmd.Flags()
40+
docCmdFlags = docCmd.Flags()
41+
formatCmdFlags = formatCmd.Flags()
42+
goCmdFlags = goCmd.Flags()
43+
javaCmdFlags = javaCmd.Flags()
44+
ktCmdFlags = ktCmd.Flags()
45+
newCmdFlags = newCmd.Flags()
46+
pluginCmdFlags = pluginCmd.Flags()
47+
tsCmdFlags = tsCmd.Flags()
48+
validateCmdFlags = validateCmd.Flags()
49+
)
50+
51+
apiCmdFlags.StringVar(&apigen.VarStringOutput, "o")
52+
apiCmdFlags.StringVar(&apigen.VarStringHome, "home")
53+
apiCmdFlags.StringVar(&apigen.VarStringRemote, "remote")
54+
apiCmdFlags.StringVar(&apigen.VarStringBranch, "branch")
55+
56+
dartCmdFlags.StringVar(&dartgen.VarStringDir, "dir")
57+
dartCmdFlags.StringVar(&dartgen.VarStringAPI, "api")
58+
dartCmdFlags.BoolVar(&dartgen.VarStringLegacy, "legacy")
59+
dartCmdFlags.StringVar(&dartgen.VarStringHostname, "hostname")
60+
dartCmdFlags.StringVar(&dartgen.VarStringScheme, "scheme")
61+
62+
docCmdFlags.StringVar(&docgen.VarStringDir, "dir")
63+
docCmdFlags.StringVar(&docgen.VarStringOutput, "o")
64+
65+
formatCmdFlags.StringVar(&format.VarStringDir, "dir")
66+
formatCmdFlags.BoolVar(&format.VarBoolIgnore, "iu")
67+
formatCmdFlags.BoolVar(&format.VarBoolUseStdin, "stdin")
68+
formatCmdFlags.BoolVar(&format.VarBoolSkipCheckDeclare, "declare")
69+
70+
goCmdFlags.StringVar(&gogen.VarStringDir, "dir")
71+
goCmdFlags.StringVar(&gogen.VarStringAPI, "api")
72+
goCmdFlags.StringVar(&gogen.VarStringHome, "home")
73+
goCmdFlags.StringVar(&gogen.VarStringRemote, "remote")
74+
goCmdFlags.StringVar(&gogen.VarStringBranch, "branch")
75+
goCmdFlags.StringVarWithDefaultValue(&gogen.VarStringStyle, "style", config.DefaultFormat)
76+
77+
javaCmdFlags.StringVar(&javagen.VarStringDir, "dir")
78+
javaCmdFlags.StringVar(&javagen.VarStringAPI, "api")
79+
80+
ktCmdFlags.StringVar(&ktgen.VarStringDir, "dir")
81+
ktCmdFlags.StringVar(&ktgen.VarStringAPI, "api")
82+
ktCmdFlags.StringVar(&ktgen.VarStringPKG, "pkg")
83+
84+
newCmdFlags.StringVar(&new.VarStringHome, "home")
85+
newCmdFlags.StringVar(&new.VarStringRemote, "remote")
86+
newCmdFlags.StringVar(&new.VarStringBranch, "branch")
87+
newCmdFlags.StringVarWithDefaultValue(&new.VarStringStyle, "style", config.DefaultFormat)
88+
89+
pluginCmdFlags.StringVarP(&plugin.VarStringPlugin, "plugin", "p")
90+
pluginCmdFlags.StringVar(&plugin.VarStringDir, "dir")
91+
pluginCmdFlags.StringVar(&plugin.VarStringAPI, "api")
92+
pluginCmdFlags.StringVar(&plugin.VarStringStyle, "style")
93+
94+
tsCmdFlags.StringVar(&tsgen.VarStringDir, "dir")
95+
tsCmdFlags.StringVar(&tsgen.VarStringAPI, "api")
96+
tsCmdFlags.StringVar(&tsgen.VarStringCaller, "caller")
97+
tsCmdFlags.BoolVar(&tsgen.VarBoolUnWrap, "unwrap")
98+
99+
validateCmdFlags.StringVar(&validate.VarStringAPI, "api")
100+
101+
// Add sub-commands
102+
Cmd.AddCommand(dartCmd, docCmd, formatCmd, goCmd, javaCmd, ktCmd, newCmd, pluginCmd, tsCmd, validateCmd)
103+
}

0 commit comments

Comments
 (0)