package cmd import ( "fmt" "log" "net/http" "runtime" "time" "management/cmd/build" "management/internal/pkg/config" "github.com/drhin/logger" "github.com/fvbock/endless" "github.com/spf13/cobra" ) var configPath string // erpCmd 代表erp命令 var erpCmd = &cobra.Command{ Use: "erp", Short: "启动 ERP 管理服务器", Long: `启动 ERP 管理服务器,可根据指定配置文件加载服务配置。 示例: # 使用默认配置文件启动服务 ./management erp # 使用自定义配置文件启动服务 ./management erp -c config.prod.yaml 该命令会初始化配置、日志系统,然后启动 HTTP 服务器监听指定端口。在 Windows 系统上使用标准的 http.Server,其他系统使用 endless 实现热重启。 `, Run: func(cmd *cobra.Command, args []string) { if err := runErp(); err != nil { log.Fatalf("run erp failed: %v", err) } }, } func runErp() error { conf, err := config.New(configPath) if err != nil { return err } l, err := logger.NewDevelopment() if err != nil { return err } app, fn, err := build.Initialize(conf, l) if err != nil { return err } defer fn() address := fmt.Sprintf("%s:%d", conf.App.Host, conf.App.Port) log.Printf("Starting manage server on %s", address) if runtime.GOOS == "windows" { s := &http.Server{ Addr: address, Handler: app, ReadTimeout: 20 * time.Second, WriteTimeout: 20 * time.Second, MaxHeaderBytes: 1 << 20, } return s.ListenAndServe() } else { s := endless.NewServer(address, app) s.ReadHeaderTimeout = 20 * time.Second s.WriteTimeout = 20 * time.Second s.MaxHeaderBytes = 1 << 20 return s.ListenAndServe() } //return nil } func init() { rootCmd.AddCommand(erpCmd) // 在这里,您将定义您的标志和配置设置。 // Cobra支持适用于此命令的持久标志 // 以及所有子命令,例如: // erpCmd.PersistentFlags().String("foo", "", "A help for foo") // Cobra支持仅在执行以下命令时运行的本地标志 // 直接调用,例如: // erpCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") erpCmd.Flags().StringVarP(&configPath, "config", "c", "configs/config.dev.yaml", "custom config file") }