203 lines
5.3 KiB
Go
203 lines
5.3 KiB
Go
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"
|
||
}
|