kra/cmd/kra-gen/root.go

203 lines
5.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"fmt"
"os"
"github.com/spf13/cobra"
"gopkg.in/yaml.v3"
)
var (
// Version information
version = "v1.0.0"
// Global flags
configFile string
outputDir string
templateDir string
verbose bool
)
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "kra-gen",
Short: "KRA 代码生成工具",
Long: `KRA 自动代码生成工具,支持生成 Kratos DDD 架构的后端代码和 React 前端代码。
功能特性:
- 生成符合 Kratos DDD 分层架构的代码biz/data/service/server
- 使用 GORM Gen 生成类型安全的数据库操作代码
- 生成 React TypeScript 前端代码
- 支持配置文件和命令行参数两种方式
- 支持预览模式,不写入文件
使用示例:
# 从配置文件生成代码
kra-gen generate -c autocode.yaml
# 交互模式
kra-gen generate -i
# 预览模式
kra-gen generate -c autocode.yaml -p
# 查看版本
kra-gen version`,
Run: func(cmd *cobra.Command, args []string) {
// If no subcommand is provided, show help
cmd.Help()
},
}
func init() {
// Global flags
rootCmd.PersistentFlags().StringVarP(&configFile, "config", "c", "", "配置文件路径 (JSON/YAML)")
rootCmd.PersistentFlags().StringVarP(&outputDir, "output", "o", "", "输出目录(默认当前项目)")
rootCmd.PersistentFlags().StringVarP(&templateDir, "template", "t", "", "模板目录(默认 resource/package")
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "显示详细输出")
// Add subcommands
rootCmd.AddCommand(versionCmd)
rootCmd.AddCommand(generateCmd)
rootCmd.AddCommand(previewCmd)
rootCmd.AddCommand(listCmd)
}
// versionCmd represents the version command
var versionCmd = &cobra.Command{
Use: "version",
Short: "显示版本信息",
Long: "显示 KRA 代码生成工具的版本信息",
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("kra-gen %s\n", version)
fmt.Println("KRA 自动代码生成工具")
fmt.Println("支持 Kratos DDD 架构 + GORM Gen + React TypeScript")
},
}
// listCmd represents the list command for listing available templates or packages
var listCmd = &cobra.Command{
Use: "list [templates|packages|databases]",
Short: "列出可用资源",
Long: `列出可用的模板、包或数据库连接。
使用示例:
kra-gen list templates # 列出可用模板
kra-gen list packages # 列出已创建的包
kra-gen list databases # 列出数据库连接`,
Args: cobra.MaximumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
fmt.Println("请指定要列出的资源类型: templates, packages, databases")
return
}
switch args[0] {
case "templates":
listTemplates()
case "packages":
listPackages()
case "databases":
listDatabases()
default:
fmt.Printf("未知的资源类型: %s\n", args[0])
fmt.Println("可用类型: templates, packages, databases")
}
},
}
func listTemplates() {
fmt.Println("可用模板:")
fmt.Println(" package - 标准包模板 (Kratos DDD 架构)")
fmt.Println(" plugin - 插件模板 (独立功能模块)")
}
func listPackages() {
// TODO: 实现从数据库或文件系统读取已创建的包
fmt.Println("已创建的包:")
fmt.Println(" (需要连接数据库获取)")
}
func listDatabases() {
// 尝试从配置文件加载数据库连接
configPath := "configs/config.yaml"
if _, err := os.Stat(configPath); err != nil {
fmt.Println("数据库连接:")
fmt.Println(" 未找到配置文件 configs/config.yaml")
fmt.Println(" 请使用 'kra-gen generate -i' 进入交互模式配置数据库")
return
}
data, err := os.ReadFile(configPath)
if err != nil {
fmt.Printf("读取配置文件失败: %v\n", err)
return
}
var config struct {
Mysql struct {
Path string `yaml:"path"`
Port string `yaml:"port"`
DBName string `yaml:"db_name"`
Username string `yaml:"username"`
} `yaml:"mysql"`
Pgsql struct {
Path string `yaml:"path"`
Port string `yaml:"port"`
DBName string `yaml:"db_name"`
Username string `yaml:"username"`
} `yaml:"pgsql"`
Sqlite struct {
DBName string `yaml:"db_name"`
} `yaml:"sqlite"`
}
if err := yaml.Unmarshal(data, &config); err != nil {
fmt.Printf("解析配置文件失败: %v\n", err)
return
}
fmt.Println("数据库连接:")
found := false
if config.Mysql.Path != "" && config.Mysql.DBName != "" {
fmt.Printf(" MySQL: %s@%s:%s/%s\n", config.Mysql.Username, config.Mysql.Path, config.Mysql.Port, config.Mysql.DBName)
found = true
}
if config.Pgsql.Path != "" && config.Pgsql.DBName != "" {
fmt.Printf(" PostgreSQL: %s@%s:%s/%s\n", config.Pgsql.Username, config.Pgsql.Path, config.Pgsql.Port, config.Pgsql.DBName)
found = true
}
if config.Sqlite.DBName != "" {
fmt.Printf(" SQLite: %s\n", config.Sqlite.DBName)
found = true
}
if !found {
fmt.Println(" 未配置任何数据库连接")
}
}
// getWorkingDir returns the current working directory or the specified output directory
func getWorkingDir() string {
if outputDir != "" {
return outputDir
}
dir, err := os.Getwd()
if err != nil {
return "."
}
return dir
}
// getTemplateDir returns the template directory path
func getTemplateDir() string {
if templateDir != "" {
return templateDir
}
return "resource/package"
}