95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package cmd
 | ||
| 
 | ||
| import (
 | ||
| 	"fmt"
 | ||
| 	"log"
 | ||
| 	"net/http"
 | ||
| 	"runtime"
 | ||
| 	"time"
 | ||
| 
 | ||
| 	"management/internal/erpserver"
 | ||
| 	"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 {
 | ||
| 	config, err := config.New(configPath)
 | ||
| 	if err != nil {
 | ||
| 		return err
 | ||
| 	}
 | ||
| 
 | ||
| 	l, err := logger.NewDevelopment()
 | ||
| 	if err != nil {
 | ||
| 		return err
 | ||
| 	}
 | ||
| 
 | ||
| 	mux, fn, err := erpserver.NewWire(config, l)
 | ||
| 	if err != nil {
 | ||
| 		return err
 | ||
| 	}
 | ||
| 
 | ||
| 	defer fn()
 | ||
| 
 | ||
| 	address := fmt.Sprintf("%s:%d", config.App.Host, config.App.Port)
 | ||
| 	log.Printf("Starting manage server on %s", address)
 | ||
| 
 | ||
| 	if runtime.GOOS == "windows" {
 | ||
| 		s := &http.Server{
 | ||
| 			Addr:           address,
 | ||
| 			Handler:        mux,
 | ||
| 			ReadTimeout:    20 * time.Second,
 | ||
| 			WriteTimeout:   20 * time.Second,
 | ||
| 			MaxHeaderBytes: 1 << 20,
 | ||
| 		}
 | ||
| 		return s.ListenAndServe()
 | ||
| 	} else {
 | ||
| 		s := endless.NewServer(address, mux)
 | ||
| 		s.ReadHeaderTimeout = 20 * time.Second
 | ||
| 		s.WriteTimeout = 20 * time.Second
 | ||
| 		s.MaxHeaderBytes = 1 << 20
 | ||
| 		return s.ListenAndServe()
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| 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")
 | ||
| }
 |