diff --git a/tools/goctl/docker/docker.go b/tools/goctl/docker/docker.go index 0c97f63e..907f7aa0 100644 --- a/tools/goctl/docker/docker.go +++ b/tools/goctl/docker/docker.go @@ -5,8 +5,10 @@ import ( "os" "path/filepath" "strings" + "text/template" - "github.com/tal-tech/go-zero/tools/goctl/gen" + "github.com/tal-tech/go-zero/tools/goctl/util" + ctlutil "github.com/tal-tech/go-zero/tools/goctl/util" "github.com/urfave/cli" ) @@ -26,7 +28,7 @@ func DockerCommand(c *cli.Context) error { return err } - return gen.GenerateDockerfile(goFile, "-f", "etc/"+cfg) + return generateDockerfile(goFile, "-f", "etc/"+cfg) } func findConfig(file, dir string) (string, error) { @@ -57,3 +59,56 @@ func findConfig(file, dir string) (string, error) { return files[0], nil } + +func generateDockerfile(goFile string, args ...string) error { + projPath, err := getFilePath(filepath.Dir(goFile)) + if err != nil { + return err + } + + pos := strings.IndexByte(projPath, '/') + if pos >= 0 { + projPath = projPath[pos+1:] + } + + out, err := util.CreateIfNotExist("Dockerfile") + if err != nil { + return err + } + defer out.Close() + + text, err := ctlutil.LoadTemplate(category, dockerTemplateFile, dockerTemplate) + if err != nil { + return err + } + + var builder strings.Builder + for _, arg := range args { + builder.WriteString(`, "` + arg + `"`) + } + + t := template.Must(template.New("dockerfile").Parse(text)) + return t.Execute(out, map[string]string{ + "goRelPath": projPath, + "goFile": goFile, + "exeFile": util.FileNameWithoutExt(filepath.Base(goFile)), + "argument": builder.String(), + }) +} + +func getFilePath(file string) (string, error) { + wd, err := os.Getwd() + if err != nil { + return "", err + } + + projPath, ok := util.FindGoModPath(filepath.Join(wd, file)) + if !ok { + projPath, err = util.PathFromGoSrc() + if err != nil { + return "", errors.New("no go.mod found, or not in GOPATH") + } + } + + return projPath, nil +} diff --git a/tools/goctl/gen/template.go b/tools/goctl/docker/template.go similarity index 58% rename from tools/goctl/gen/template.go rename to tools/goctl/docker/template.go index ce79bb23..27f90e47 100644 --- a/tools/goctl/gen/template.go +++ b/tools/goctl/docker/template.go @@ -1,6 +1,14 @@ -package gen +package docker -const dockerTemplate = `FROM golang:alpine AS builder +import ( + "github.com/tal-tech/go-zero/tools/goctl/util" + "github.com/urfave/cli" +) + +const ( + category = "docker" + dockerTemplateFile = "docker.tpl" + dockerTemplate = `FROM golang:alpine AS builder LABEL stage=gobuilder @@ -27,3 +35,10 @@ COPY --from=builder /app/etc /app/etc CMD ["./{{.exeFile}}"{{.argument}}] ` +) + +func GenTemplates(_ *cli.Context) error { + return util.InitTemplates(category, map[string]string{ + dockerTemplateFile: dockerTemplate, + }) +} diff --git a/tools/goctl/gen/dockerfile.go b/tools/goctl/gen/dockerfile.go deleted file mode 100644 index 6523b5be..00000000 --- a/tools/goctl/gen/dockerfile.go +++ /dev/null @@ -1,40 +0,0 @@ -package gen - -import ( - "path/filepath" - "strings" - "text/template" - - "github.com/tal-tech/go-zero/tools/goctl/util" -) - -func GenerateDockerfile(goFile string, args ...string) error { - projPath, err := getFilePath(filepath.Dir(goFile)) - if err != nil { - return err - } - - pos := strings.IndexByte(projPath, '/') - if pos >= 0 { - projPath = projPath[pos+1:] - } - - out, err := util.CreateIfNotExist("Dockerfile") - if err != nil { - return err - } - defer out.Close() - - var builder strings.Builder - for _, arg := range args { - builder.WriteString(`, "` + arg + `"`) - } - - t := template.Must(template.New("dockerfile").Parse(dockerTemplate)) - return t.Execute(out, map[string]string{ - "goRelPath": projPath, - "goFile": goFile, - "exeFile": util.FileNameWithoutExt(filepath.Base(goFile)), - "argument": builder.String(), - }) -} diff --git a/tools/goctl/gen/filepath.go b/tools/goctl/gen/filepath.go deleted file mode 100644 index 79ec2149..00000000 --- a/tools/goctl/gen/filepath.go +++ /dev/null @@ -1,26 +0,0 @@ -package gen - -import ( - "errors" - "os" - "path/filepath" - - "github.com/tal-tech/go-zero/tools/goctl/util" -) - -func getFilePath(file string) (string, error) { - wd, err := os.Getwd() - if err != nil { - return "", err - } - - projPath, ok := util.FindGoModPath(filepath.Join(wd, file)) - if !ok { - projPath, err = util.PathFromGoSrc() - if err != nil { - return "", errors.New("no go.mod found, or not in GOPATH") - } - } - - return projPath, nil -} diff --git a/tools/goctl/tpl/templates.go b/tools/goctl/tpl/templates.go index 492d85e9..5c71893c 100644 --- a/tools/goctl/tpl/templates.go +++ b/tools/goctl/tpl/templates.go @@ -6,6 +6,7 @@ import ( "github.com/logrusorgru/aurora" "github.com/tal-tech/go-zero/core/errorx" "github.com/tal-tech/go-zero/tools/goctl/api/gogen" + "github.com/tal-tech/go-zero/tools/goctl/docker" modelgen "github.com/tal-tech/go-zero/tools/goctl/model/sql/gen" rpcgen "github.com/tal-tech/go-zero/tools/goctl/rpc/generator" "github.com/tal-tech/go-zero/tools/goctl/util" @@ -25,6 +26,9 @@ func GenTemplates(ctx *cli.Context) error { func() error { return rpcgen.GenTemplates(ctx) }, + func() error { + return docker.GenTemplates(ctx) + }, ); err != nil { return err }