From 0d05d70fb1e5c57ce63a32d2bad72155edce6f47 Mon Sep 17 00:00:00 2001 From: Rogee Date: Wed, 10 Sep 2025 14:54:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=B8=BA=20v2=EF=BC=8C=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=92=8C=E4=BB=A3=E7=A0=81=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 42 +++++---- cmd/gen_enum.go | 4 +- cmd/gen_model.go | 62 ++++++------- cmd/gen_provider.go | 4 +- cmd/gen_route.go | 50 +++++------ cmd/migrate.go | 30 +++---- cmd/new_event.go | 168 +++++++++++++++++++---------------- cmd/new_job.go | 66 +++++++------- cmd/new_module.go | 4 +- cmd/new_project.go | 118 ++++++++++++------------ cmd/new_provider.go | 74 +++++++-------- go.mod | 2 +- main.go | 2 +- pkg/ast/model/generage.go | 2 +- pkg/ast/provider/provider.go | 2 +- pkg/ast/provider/render.go | 2 +- pkg/ast/route/render.go | 2 +- pkg/ast/route/route.go | 2 +- 18 files changed, 328 insertions(+), 308 deletions(-) diff --git a/README.md b/README.md index 6706ae4..0f9139f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Install ``` -go install go.ipao.vip/atomctl@latest +go install go.ipao.vip/atomctl/v2@latest ``` ## 命令列表 @@ -11,45 +11,49 @@ go install go.ipao.vip/atomctl@latest ### 生成命令 #### gen model (别名:m) -- 描述:生成jet模型 + +- 描述:生成 jet 模型 - 功能: - - 从PostgreSQL数据库生成模型 - - 使用database/transform.yaml配置文件进行类型转换 + - 从 PostgreSQL 数据库生成模型 + - 使用 database/transform.yaml 配置文件进行类型转换 - 支持忽略特定表和枚举 - - 生成JSON标签 + - 生成 JSON 标签 - 支持自定义字段类型映射 - - 自动生成数据库schema文件 + - 自动生成数据库 schema 文件 #### gen provider (别名:p) -- 描述:生成provider + +- 描述:生成 provider - 参数: - path:可选,指定生成路径(默认当前目录) - 功能: - - 解析指定目录下的.go文件 - - 查找带有@provider注释的结构体 + - 解析指定目录下的.go 文件 + - 查找带有@provider 注释的结构体 - 支持 `@provider(grpc|event|job):[except|only] [returnType] [group]` 注释 - - 自动生成provider文件 + - 自动生成 provider 文件 - 支持分组生成 #### gen route + - 描述:生成路由 - 参数: - path:可选,指定生成路径(默认当前目录) - 功能: - - 解析app/http目录下的controller文件 + - 解析 app/http 目录下的 controller 文件 - 自动生成路由定义 - 支持分组生成路由 - - 生成完成后自动执行gen provider命令 + - 生成完成后自动执行 gen provider 命令 ### 数据库命令 #### migrate (别名:m) + - 描述:数据库迁移 - 参数: - action:必选,迁移操作(up|up-by-one|up-to|create|down|down-to|fix|redo|reset|status|version) - args:可选,操作参数 - 选项: - - -c/--config:指定数据库配置文件(默认config.toml) + - -c/--config:指定数据库配置文件(默认 config.toml) - 功能: - 执行数据库迁移 - 支持创建迁移文件 @@ -59,9 +63,10 @@ go install go.ipao.vip/atomctl@latest ### 新建命令 #### new project (别名:p) + - 描述:创建新项目 - 参数: - - moduleName:必选,项目模块名(需符合Go包名规范) + - moduleName:必选,项目模块名(需符合 Go 包名规范) - 选项: - --force:强制覆盖已存在项目 - 功能: @@ -71,11 +76,12 @@ go install go.ipao.vip/atomctl@latest - 生成完成后提示后续步骤 #### new provider -- 描述:创建新的provider + +- 描述:创建新的 provider - 参数: - - providerName:必选,provider名称 + - providerName:必选,provider 名称 - 功能: - - 在providers目录下创建新的provider - - 自动生成provider模板文件 + - 在 providers 目录下创建新的 provider + - 自动生成 provider 模板文件 - 支持模板渲染 - 自动处理命名转换(如驼峰命名) diff --git a/cmd/gen_enum.go b/cmd/gen_enum.go index 83ec1d5..76d5223 100644 --- a/cmd/gen_enum.go +++ b/cmd/gen_enum.go @@ -10,8 +10,8 @@ import ( _ "github.com/lib/pq" "github.com/spf13/cobra" - "go.ipao.vip/atomctl/pkg/utils" - "go.ipao.vip/atomctl/pkg/utils/generator" + "go.ipao.vip/atomctl/v2/pkg/utils" + "go.ipao.vip/atomctl/v2/pkg/utils/generator" ) func CommandGenEnum(root *cobra.Command) { diff --git a/cmd/gen_model.go b/cmd/gen_model.go index 1d28f47..1f11e4c 100644 --- a/cmd/gen_model.go +++ b/cmd/gen_model.go @@ -6,7 +6,7 @@ import ( "regexp" "strings" - astModel "go.ipao.vip/atomctl/pkg/ast/model" + astModel "go.ipao.vip/atomctl/v2/pkg/ast/model" "github.com/go-jet/jet/v2/generator/metadata" "github.com/go-jet/jet/v2/generator/postgres" @@ -19,22 +19,22 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" - "go.ipao.vip/atomctl/pkg/ast/model" - pgDatabase "go.ipao.vip/atomctl/pkg/postgres" - "go.ipao.vip/atomctl/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/pkg/ast/model" + pgDatabase "go.ipao.vip/atomctl/v2/pkg/postgres" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" ) func CommandGenModel(root *cobra.Command) { - cmd := &cobra.Command{ - Use: "model", - Aliases: []string{"m"}, - Short: "Generate jet models", - RunE: commandGenModelE, - } + cmd := &cobra.Command{ + Use: "model", + Aliases: []string{"m"}, + Short: "Generate jet models", + RunE: commandGenModelE, + } - cmd.Flags().String("schema", "", "Override database schema") - cmd.Flags().Bool("rename-schemas", true, "Rename generated database/ to database/schemas") - cmd.Flags().String("schemas-out", "database/schemas", "Schemas output directory when renaming") + cmd.Flags().String("schema", "", "Override database schema") + cmd.Flags().Bool("rename-schemas", true, "Rename generated database/ to database/schemas") + cmd.Flags().String("schemas-out", "database/schemas", "Schemas output directory when renaming") root.AddCommand(cmd) } @@ -44,15 +44,15 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { return errors.Wrap(err, "parse go.mod") } - _, dbConf, err := pgDatabase.GetDB(cmd.Flag("config").Value.String()) - if err != nil { - return errors.Wrap(err, "get db") - } + _, dbConf, err := pgDatabase.GetDB(cmd.Flag("config").Value.String()) + if err != nil { + return errors.Wrap(err, "get db") + } - // optional schema override - if s := cmd.Flag("schema").Value.String(); s != "" { - dbConf.Schema = s - } + // optional schema override + if s := cmd.Flag("schema").Value.String(); s != "" { + dbConf.Schema = s + } v := viper.New() v.SetConfigType("yaml") @@ -175,16 +175,16 @@ func commandGenModelE(cmd *cobra.Command, args []string) error { return err } - if rename, _ := cmd.Flags().GetBool("rename-schemas"); rename { - out := cmd.Flag("schemas-out").Value.String() - if err := os.RemoveAll(out); err != nil { - return err - } - dataPath := fmt.Sprintf("database/%s", cfg.Database) - if err := os.Rename(dataPath, out); err != nil { - return err - } - } + if rename, _ := cmd.Flags().GetBool("rename-schemas"); rename { + out := cmd.Flag("schemas-out").Value.String() + if err := os.RemoveAll(out); err != nil { + return err + } + dataPath := fmt.Sprintf("database/%s", cfg.Database) + if err := os.Rename(dataPath, out); err != nil { + return err + } + } if err := astModel.Generate(generatedTables, transformer); err != nil { return err diff --git a/cmd/gen_provider.go b/cmd/gen_provider.go index 4413418..a74f066 100644 --- a/cmd/gen_provider.go +++ b/cmd/gen_provider.go @@ -6,11 +6,11 @@ import ( "path/filepath" "strings" - "go.ipao.vip/atomctl/pkg/ast/provider" - "go.ipao.vip/atomctl/pkg/utils/gomod" "github.com/samber/lo" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/pkg/ast/provider" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" ) func CommandGenProvider(root *cobra.Command) { diff --git a/cmd/gen_route.go b/cmd/gen_route.go index 319d959..652d830 100644 --- a/cmd/gen_route.go +++ b/cmd/gen_route.go @@ -10,40 +10,40 @@ import ( "github.com/samber/lo" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "go.ipao.vip/atomctl/pkg/ast/route" - "go.ipao.vip/atomctl/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/pkg/ast/route" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" ) func CommandGenRoute(root *cobra.Command) { - cmd := &cobra.Command{ - Use: "route", - Short: "generate routes", - RunE: commandGenRouteE, - PostRunE: commandGenProviderE, - } + cmd := &cobra.Command{ + Use: "route", + Short: "generate routes", + RunE: commandGenRouteE, + PostRunE: commandGenProviderE, + } - cmd.Flags().String("path", ".", "Base path to scan (defaults to CWD)") + cmd.Flags().String("path", ".", "Base path to scan (defaults to CWD)") - root.AddCommand(cmd) + root.AddCommand(cmd) } -// https://go.ipao.vip/atomctl/pkg/swag?tab=readme-ov-file#api-operation +// https://go.ipao.vip/atomctl/v2/pkg/swag?tab=readme-ov-file#api-operation func commandGenRouteE(cmd *cobra.Command, args []string) error { - var err error - var path string - if len(args) > 0 { - path = args[0] - } else { - path, err = os.Getwd() - if err != nil { - return err - } - } + var err error + var path string + if len(args) > 0 { + path = args[0] + } else { + path, err = os.Getwd() + if err != nil { + return err + } + } - // allow overriding via --path flag - if f := cmd.Flag("path"); f != nil && f.Value.String() != "." && f.Value.String() != "" { - path = f.Value.String() - } + // allow overriding via --path flag + if f := cmd.Flag("path"); f != nil && f.Value.String() != "." && f.Value.String() != "" { + path = f.Value.String() + } path, _ = filepath.Abs(path) diff --git a/cmd/migrate.go b/cmd/migrate.go index 1e80da0..ff8e405 100644 --- a/cmd/migrate.go +++ b/cmd/migrate.go @@ -3,24 +3,24 @@ package cmd import ( "context" - "go.ipao.vip/atomctl/pkg/postgres" "github.com/pkg/errors" "github.com/pressly/goose/v3" "github.com/samber/lo" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/pkg/postgres" ) // migrate func CommandMigrate(root *cobra.Command) { - cmd := &cobra.Command{ - Use: "migrate [up|up-by-one|up-to|create|down|down-to|fix|redo|reset|status|version]", - Aliases: []string{"m"}, - RunE: commandMigrate, - } - cmd.Flags().StringP("config", "c", "config.toml", "database config file") - cmd.Flags().String("dir", "database/migrations", "migrations directory") - cmd.Flags().String("table", "migrations", "migrations table name") + cmd := &cobra.Command{ + Use: "migrate [up|up-by-one|up-to|create|down|down-to|fix|redo|reset|status|version]", + Aliases: []string{"m"}, + RunE: commandMigrate, + } + cmd.Flags().StringP("config", "c", "config.toml", "database config file") + cmd.Flags().String("dir", "database/migrations", "migrations directory") + cmd.Flags().String("table", "migrations", "migrations table name") root.AddCommand(cmd) } @@ -41,13 +41,13 @@ func commandMigrate(cmd *cobra.Command, args []string) error { return errors.Wrap(err, "get db") } - action, args := args[0], args[1:] - log.Infof("migration action: %s args: %+v", action, args) + action, args := args[0], args[1:] + log.Infof("migration action: %s args: %+v", action, args) - dir := cmd.Flag("dir").Value.String() - table := cmd.Flag("table").Value.String() + dir := cmd.Flag("dir").Value.String() + table := cmd.Flag("table").Value.String() - goose.SetTableName(table) + goose.SetTableName(table) - return goose.RunContext(context.Background(), action, db, dir, args...) + return goose.RunContext(context.Background(), action, db, dir, args...) } diff --git a/cmd/new_event.go b/cmd/new_event.go index 182cc43..cc78a76 100644 --- a/cmd/new_event.go +++ b/cmd/new_event.go @@ -1,45 +1,45 @@ package cmd import ( - "fmt" - "io/fs" - "os" - "path/filepath" - "strings" - "text/template" + "fmt" + "io/fs" + "os" + "path/filepath" + "strings" + "text/template" - "go.ipao.vip/atomctl/pkg/utils/gomod" - "go.ipao.vip/atomctl/templates" "github.com/samber/lo" "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/templates" ) // CommandNewProvider 注册 new_provider 命令 func CommandNewEvent(root *cobra.Command) { - cmd := &cobra.Command{ - Use: "event", - Aliases: []string{"e"}, - Short: "创建新的 event publish & subscriber", - Args: cobra.ExactArgs(1), - RunE: commandNewEventE, - } + cmd := &cobra.Command{ + Use: "event", + Aliases: []string{"e"}, + Short: "创建新的 event publish & subscriber", + Args: cobra.ExactArgs(1), + RunE: commandNewEventE, + } - cmd.Flags().String("only", "", "仅生成: publisher 或 subscriber") + cmd.Flags().String("only", "", "仅生成: publisher 或 subscriber") - root.AddCommand(cmd) + root.AddCommand(cmd) } func commandNewEventE(cmd *cobra.Command, args []string) error { snakeName := lo.SnakeCase(args[0]) camelName := lo.PascalCase(args[0]) - // shared flags - dryRun, _ := cmd.Flags().GetBool("dry-run") - baseDir, _ := cmd.Flags().GetString("dir") - only, _ := cmd.Flags().GetString("only") + // shared flags + dryRun, _ := cmd.Flags().GetBool("dry-run") + baseDir, _ := cmd.Flags().GetString("dir") + only, _ := cmd.Flags().GetString("only") - publisherPath := filepath.Join(baseDir, "app/events/publishers") - subscriberPath := filepath.Join(baseDir, "app/events/subscribers") + publisherPath := filepath.Join(baseDir, "app/events/publishers") + subscriberPath := filepath.Join(baseDir, "app/events/subscribers") path, err := os.Getwd() if err != nil { @@ -52,17 +52,17 @@ func commandNewEventE(cmd *cobra.Command, args []string) error { return err } - if dryRun { - fmt.Printf("[dry-run] mkdir -p %s\n", publisherPath) - fmt.Printf("[dry-run] mkdir -p %s\n", subscriberPath) - } else { - if err := os.MkdirAll(publisherPath, os.ModePerm); err != nil { - return err - } - if err := os.MkdirAll(subscriberPath, os.ModePerm); err != nil { - return err - } - } + if dryRun { + fmt.Printf("[dry-run] mkdir -p %s\n", publisherPath) + fmt.Printf("[dry-run] mkdir -p %s\n", subscriberPath) + } else { + if err := os.MkdirAll(publisherPath, os.ModePerm); err != nil { + return err + } + if err := os.MkdirAll(subscriberPath, os.ModePerm); err != nil { + return err + } + } err = fs.WalkDir(templates.Events, "events", func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -77,59 +77,73 @@ func commandNewEventE(cmd *cobra.Command, args []string) error { return err } - var destPath string - if relPath == "publisher.go.tpl" { - if only == "subscriber" { return nil } - destPath = filepath.Join(publisherPath, snakeName+".go") - } else if relPath == "subscriber.go.tpl" { - if only == "publisher" { return nil } - destPath = filepath.Join(subscriberPath, snakeName+".go") - } else { return nil } + var destPath string + if relPath == "publisher.go.tpl" { + if only == "subscriber" { + return nil + } + destPath = filepath.Join(publisherPath, snakeName+".go") + } else if relPath == "subscriber.go.tpl" { + if only == "publisher" { + return nil + } + destPath = filepath.Join(subscriberPath, snakeName+".go") + } else { + return nil + } tmpl, err := template.ParseFS(templates.Events, path) if err != nil { return err } - if dryRun { - fmt.Printf("[dry-run] render > %s\n", destPath) - return nil - } + if dryRun { + fmt.Printf("[dry-run] render > %s\n", destPath) + return nil + } - destFile, err := os.Create(destPath) - if err != nil { - return err - } - defer destFile.Close() + destFile, err := os.Create(destPath) + if err != nil { + return err + } + defer destFile.Close() - return tmpl.Execute(destFile, map[string]string{ - "Name": camelName, - "ModuleName": gomod.GetModuleName(), - }) - }) + return tmpl.Execute(destFile, map[string]string{ + "Name": camelName, + "ModuleName": gomod.GetModuleName(), + }) + }) - // 写入或追加 topic 常量,避免重复。 - topicsPath := filepath.Join(baseDir, "app/events/topics.go") - topicLine := fmt.Sprintf("const Topic%s = %q\n", camelName, snakeName) + // 写入或追加 topic 常量,避免重复。 + topicsPath := filepath.Join(baseDir, "app/events/topics.go") + topicLine := fmt.Sprintf("const Topic%s = %q\n", camelName, snakeName) - if dryRun { - fmt.Printf("[dry-run] ensure topics file and add constant > %s\n", topicsPath) - } else { - // ensure file exists with basic header - if _, statErr := os.Stat(topicsPath); os.IsNotExist(statErr) { - if err := os.MkdirAll(filepath.Dir(topicsPath), os.ModePerm); err != nil { return err } - header := "package events\n\n// topics generated by atomctl\n\n" - if err := os.WriteFile(topicsPath, []byte(header), 0o644); err != nil { return err } - } - // check duplicate - content, _ := os.ReadFile(topicsPath) - if !strings.Contains(string(content), "Topic"+camelName+" ") && !strings.Contains(string(content), topicLine) { - f, err := os.OpenFile(topicsPath, os.O_APPEND|os.O_WRONLY, 0o644) - if err != nil { return err } - defer f.Close() - if _, err := f.WriteString(topicLine); err != nil { return err } - } - } + if dryRun { + fmt.Printf("[dry-run] ensure topics file and add constant > %s\n", topicsPath) + } else { + // ensure file exists with basic header + if _, statErr := os.Stat(topicsPath); os.IsNotExist(statErr) { + if err := os.MkdirAll(filepath.Dir(topicsPath), os.ModePerm); err != nil { + return err + } + header := "package events\n\n// topics generated by atomctl\n\n" + if err := os.WriteFile(topicsPath, []byte(header), 0o644); err != nil { + return err + } + } + // check duplicate + content, _ := os.ReadFile(topicsPath) + if !strings.Contains(string(content), "Topic"+camelName+" ") && !strings.Contains(string(content), topicLine) { + f, err := os.OpenFile(topicsPath, os.O_APPEND|os.O_WRONLY, 0o644) + if err != nil { + return err + } + defer f.Close() + if _, err := f.WriteString(topicLine); err != nil { + return err + } + } + } fmt.Printf("event 已创建: %s\n", snakeName) return nil diff --git a/cmd/new_job.go b/cmd/new_job.go index 30547e4..37bcc7e 100644 --- a/cmd/new_job.go +++ b/cmd/new_job.go @@ -7,10 +7,10 @@ import ( "path/filepath" "text/template" - "go.ipao.vip/atomctl/pkg/utils/gomod" - "go.ipao.vip/atomctl/templates" "github.com/samber/lo" "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/templates" ) // CommandNewProvider 注册 new_provider 命令 @@ -26,14 +26,14 @@ func CommandNewJob(root *cobra.Command) { } func commandNewJobE(cmd *cobra.Command, args []string) error { - snakeName := lo.SnakeCase(args[0]) - camelName := lo.PascalCase(args[0]) + snakeName := lo.SnakeCase(args[0]) + camelName := lo.PascalCase(args[0]) - // shared flags - dryRun, _ := cmd.Flags().GetBool("dry-run") - baseDir, _ := cmd.Flags().GetString("dir") + // shared flags + dryRun, _ := cmd.Flags().GetBool("dry-run") + baseDir, _ := cmd.Flags().GetString("dir") - basePath := filepath.Join(baseDir, "app/jobs") + basePath := filepath.Join(baseDir, "app/jobs") path, err := os.Getwd() if err != nil { @@ -46,13 +46,13 @@ func commandNewJobE(cmd *cobra.Command, args []string) error { return err } - if dryRun { - fmt.Printf("[dry-run] mkdir -p %s\n", basePath) - } else { - if err := os.MkdirAll(basePath, os.ModePerm); err != nil { - return err - } - } + if dryRun { + fmt.Printf("[dry-run] mkdir -p %s\n", basePath) + } else { + if err := os.MkdirAll(basePath, os.ModePerm); err != nil { + return err + } + } err = fs.WalkDir(templates.Jobs, "jobs", func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -63,27 +63,27 @@ func commandNewJobE(cmd *cobra.Command, args []string) error { return nil } - filePath := filepath.Join(basePath, snakeName+".go") - tmpl, err := template.ParseFS(templates.Jobs, path) - if err != nil { - return err - } + filePath := filepath.Join(basePath, snakeName+".go") + tmpl, err := template.ParseFS(templates.Jobs, path) + if err != nil { + return err + } - if dryRun { - fmt.Printf("[dry-run] render > %s\n", filePath) - return nil - } + if dryRun { + fmt.Printf("[dry-run] render > %s\n", filePath) + return nil + } - destFile, err := os.Create(filePath) - if err != nil { - return err - } - defer destFile.Close() + destFile, err := os.Create(filePath) + if err != nil { + return err + } + defer destFile.Close() - return tmpl.Execute(destFile, map[string]string{ - "Name": camelName, - "ModuleName": gomod.GetModuleName(), - }) + return tmpl.Execute(destFile, map[string]string{ + "Name": camelName, + "ModuleName": gomod.GetModuleName(), + }) }) if err != nil { return err diff --git a/cmd/new_module.go b/cmd/new_module.go index 1dcb4fe..2d9b54e 100644 --- a/cmd/new_module.go +++ b/cmd/new_module.go @@ -9,11 +9,11 @@ import ( "strings" "text/template" - "go.ipao.vip/atomctl/pkg/utils/gomod" - "go.ipao.vip/atomctl/templates" "github.com/samber/lo" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/templates" ) func CommandNewModule(root *cobra.Command) { diff --git a/cmd/new_project.go b/cmd/new_project.go index f402cd5..625123e 100644 --- a/cmd/new_project.go +++ b/cmd/new_project.go @@ -13,8 +13,8 @@ import ( "github.com/pkg/errors" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "go.ipao.vip/atomctl/pkg/utils/gomod" - "go.ipao.vip/atomctl/templates" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/templates" ) // 验证包名是否合法:支持域名、路径分隔符和常见字符 @@ -36,14 +36,14 @@ func CommandNewProject(root *cobra.Command) { } func commandNewProjectE(cmd *cobra.Command, args []string) error { - var ( - moduleName string - inPlace bool - ) + var ( + moduleName string + inPlace bool + ) - // shared flags - dryRun, _ := cmd.Flags().GetBool("dry-run") - baseDir, _ := cmd.Flags().GetString("dir") + // shared flags + dryRun, _ := cmd.Flags().GetBool("dry-run") + baseDir, _ := cmd.Flags().GetString("dir") if len(args) == 0 { if _, err := os.Stat("go.mod"); err == nil { @@ -76,27 +76,27 @@ func commandNewProjectE(cmd *cobra.Command, args []string) error { force, _ := cmd.Flags().GetBool("force") - rootDir := "." - if !inPlace { - // honor base dir when creating a new project - rootDir = filepath.Join(baseDir, projectInfo.ProjectName) - if _, err := os.Stat(rootDir); err == nil { - if !force { - return fmt.Errorf("project directory %s already exists", rootDir) - } - log.Warnf("强制删除已存在的目录: %s", rootDir) - if dryRun { - log.Infof("[dry-run] 将删除目录: %s", rootDir) - } else if err := os.RemoveAll(rootDir); err != nil { - return fmt.Errorf("failed to remove existing directory: %v", err) - } - } - if dryRun { - log.Infof("[dry-run] 将创建目录: %s", rootDir) - } else if err := os.MkdirAll(rootDir, 0o755); err != nil { - return fmt.Errorf("failed to create project directory: %v", err) - } - } + rootDir := "." + if !inPlace { + // honor base dir when creating a new project + rootDir = filepath.Join(baseDir, projectInfo.ProjectName) + if _, err := os.Stat(rootDir); err == nil { + if !force { + return fmt.Errorf("project directory %s already exists", rootDir) + } + log.Warnf("强制删除已存在的目录: %s", rootDir) + if dryRun { + log.Infof("[dry-run] 将删除目录: %s", rootDir) + } else if err := os.RemoveAll(rootDir); err != nil { + return fmt.Errorf("failed to remove existing directory: %v", err) + } + } + if dryRun { + log.Infof("[dry-run] 将创建目录: %s", rootDir) + } else if err := os.MkdirAll(rootDir, 0o755); err != nil { + return fmt.Errorf("failed to create project directory: %v", err) + } + } if err := fs.WalkDir(templates.Project, "project", func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -115,14 +115,14 @@ func commandNewProjectE(cmd *cobra.Command, args []string) error { } targetPath := filepath.Join(rootDir, relPath) - if d.IsDir() { - log.Infof("创建目录: %s", targetPath) - if dryRun { - log.Infof("[dry-run] mkdir -p %s", targetPath) - return nil - } - return os.MkdirAll(targetPath, 0o755) - } + if d.IsDir() { + log.Infof("创建目录: %s", targetPath) + if dryRun { + log.Infof("[dry-run] mkdir -p %s", targetPath) + return nil + } + return os.MkdirAll(targetPath, 0o755) + } content, err := templates.Project.ReadFile(path) if err != nil { @@ -164,28 +164,28 @@ func commandNewProjectE(cmd *cobra.Command, args []string) error { if err != nil { return err } - log.Infof("[渲染] 文件: %s", targetPath) - if dryRun { - log.Infof("[dry-run] render > %s", targetPath) - return nil - } - f, err := os.Create(targetPath) - if err != nil { - return errors.Wrapf(err, "创建文件失败 %s", targetPath) - } - defer f.Close() - return tmpl.Execute(f, projectInfo) - } + log.Infof("[渲染] 文件: %s", targetPath) + if dryRun { + log.Infof("[dry-run] render > %s", targetPath) + return nil + } + f, err := os.Create(targetPath) + if err != nil { + return errors.Wrapf(err, "创建文件失败 %s", targetPath) + } + defer f.Close() + return tmpl.Execute(f, projectInfo) + } - log.Infof("[复制] 文件: %s", targetPath) - if dryRun { - log.Infof("[dry-run] write > %s", targetPath) - return nil - } - return os.WriteFile(targetPath, content, 0o644) - }); err != nil { - return err - } + log.Infof("[复制] 文件: %s", targetPath) + if dryRun { + log.Infof("[dry-run] write > %s", targetPath) + return nil + } + return os.WriteFile(targetPath, content, 0o644) + }); err != nil { + return err + } if inPlace { log.Info("🎉 项目初始化成功 (当前目录)!") diff --git a/cmd/new_provider.go b/cmd/new_provider.go index 04509fb..b8f0bf9 100644 --- a/cmd/new_provider.go +++ b/cmd/new_provider.go @@ -9,9 +9,9 @@ import ( "strings" "text/template" - "go.ipao.vip/atomctl/templates" "github.com/iancoleman/strcase" "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/templates" ) // CommandNewProvider 注册 new_provider 命令 @@ -27,24 +27,24 @@ func CommandNewProvider(root *cobra.Command) { } func commandNewProviderE(cmd *cobra.Command, args []string) error { - providerName := args[0] - // shared flags - dryRun, _ := cmd.Flags().GetBool("dry-run") - baseDir, _ := cmd.Flags().GetString("dir") + providerName := args[0] + // shared flags + dryRun, _ := cmd.Flags().GetBool("dry-run") + baseDir, _ := cmd.Flags().GetString("dir") - targetPath := filepath.Join(baseDir, "providers", providerName) + targetPath := filepath.Join(baseDir, "providers", providerName) - if _, err := os.Stat(targetPath); err == nil { - return fmt.Errorf("目录 %s 已存在", targetPath) - } + if _, err := os.Stat(targetPath); err == nil { + return fmt.Errorf("目录 %s 已存在", targetPath) + } - if dryRun { - fmt.Printf("[dry-run] mkdir -p %s\n", targetPath) - } else { - if err := os.MkdirAll(targetPath, os.ModePerm); err != nil { - return err - } - } + if dryRun { + fmt.Printf("[dry-run] mkdir -p %s\n", targetPath) + } else { + if err := os.MkdirAll(targetPath, os.ModePerm); err != nil { + return err + } + } err := fs.WalkDir(templates.Provider, "provider", func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -59,35 +59,35 @@ func commandNewProviderE(cmd *cobra.Command, args []string) error { return err } - destPath := filepath.Join(targetPath, strings.TrimSuffix(relPath, ".tpl")) - if dryRun { - fmt.Printf("[dry-run] mkdir -p %s\n", filepath.Dir(destPath)) - } else { - if err := os.MkdirAll(filepath.Dir(destPath), os.ModePerm); err != nil { - return err - } - } + destPath := filepath.Join(targetPath, strings.TrimSuffix(relPath, ".tpl")) + if dryRun { + fmt.Printf("[dry-run] mkdir -p %s\n", filepath.Dir(destPath)) + } else { + if err := os.MkdirAll(filepath.Dir(destPath), os.ModePerm); err != nil { + return err + } + } tmpl, err := template.ParseFS(templates.Provider, path) if err != nil { return err } - if dryRun { - fmt.Printf("[dry-run] render > %s\n", destPath) - return nil - } + if dryRun { + fmt.Printf("[dry-run] render > %s\n", destPath) + return nil + } - destFile, err := os.Create(destPath) - if err != nil { - return err - } - defer destFile.Close() + destFile, err := os.Create(destPath) + if err != nil { + return err + } + defer destFile.Close() - return tmpl.Execute(destFile, map[string]string{ - "Name": providerName, - "CamelName": strcase.ToCamel(providerName), - }) + return tmpl.Execute(destFile, map[string]string{ + "Name": providerName, + "CamelName": strcase.ToCamel(providerName), + }) }) if err != nil { return errors.New("渲染 provider 模板失败") diff --git a/go.mod b/go.mod index 3c37edd..4f9162f 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module go.ipao.vip/atomctl +module go.ipao.vip/atomctl/v2 go 1.23.2 diff --git a/main.go b/main.go index be8a3d4..a9434b6 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,9 @@ package main import ( - "go.ipao.vip/atomctl/cmd" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "go.ipao.vip/atomctl/v2/cmd" ) func main() { diff --git a/pkg/ast/model/generage.go b/pkg/ast/model/generage.go index a6f3f7e..8187013 100644 --- a/pkg/ast/model/generage.go +++ b/pkg/ast/model/generage.go @@ -10,7 +10,7 @@ import ( "github.com/samber/lo" log "github.com/sirupsen/logrus" - "go.ipao.vip/atomctl/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" ) //go:embed table.go.tpl diff --git a/pkg/ast/provider/provider.go b/pkg/ast/provider/provider.go index b012247..aaf4a6e 100644 --- a/pkg/ast/provider/provider.go +++ b/pkg/ast/provider/provider.go @@ -11,7 +11,7 @@ import ( "github.com/samber/lo" log "github.com/sirupsen/logrus" - "go.ipao.vip/atomctl/pkg/utils/gomod" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" ) func getTypePkgName(typ string) string { diff --git a/pkg/ast/provider/render.go b/pkg/ast/provider/render.go index f2296bb..c65af84 100644 --- a/pkg/ast/provider/render.go +++ b/pkg/ast/provider/render.go @@ -6,8 +6,8 @@ import ( "os" "strings" - "go.ipao.vip/atomctl/pkg/utils/gomod" "github.com/samber/lo" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" "golang.org/x/tools/imports" ) diff --git a/pkg/ast/route/render.go b/pkg/ast/route/render.go index 90cd156..a9f45d4 100644 --- a/pkg/ast/route/render.go +++ b/pkg/ast/route/render.go @@ -8,10 +8,10 @@ import ( "path/filepath" "text/template" - "go.ipao.vip/atomctl/pkg/utils/gomod" "github.com/Masterminds/sprig/v3" "github.com/iancoleman/strcase" "github.com/samber/lo" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" ) //go:embed router.go.tpl diff --git a/pkg/ast/route/route.go b/pkg/ast/route/route.go index 9bc0f1f..9c653ba 100644 --- a/pkg/ast/route/route.go +++ b/pkg/ast/route/route.go @@ -7,10 +7,10 @@ import ( "go/token" "strings" - "go.ipao.vip/atomctl/pkg/utils/gomod" "github.com/pkg/errors" "github.com/samber/lo" log "github.com/sirupsen/logrus" + "go.ipao.vip/atomctl/v2/pkg/utils/gomod" ) type RouteDefinition struct {