From d818cf3b4cf5bd7b823ed24d7d9281e3020897cf Mon Sep 17 00:00:00 2001 From: Sakurasan <26715255+Sakurasan@users.noreply.github.com> Date: Wed, 26 Aug 2026 18:14:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=91=BD=E4=BB=A4=E6=A0=91?= =?UTF-8?q?=E7=A7=BB=E5=85=A5=20internal/cli=EF=BC=8C=E5=8E=BB=E6=8E=89=20?= =?UTF-8?q?DefaultRun=20=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cmd/server/cmd → internal/cli,与 internal/api、internal/proxy 平级 - serve() 移入 cli 包作为默认子命令,main.go 退化为纯入口 - 消除 cmd/cmd 冗余层级和 main → cmd 的回调注入 --- server/cmd/server/main.go | 67 +------------------ .../cmd => internal/cli}/reset_admin.go | 6 +- .../{cmd/server/cmd => internal/cli}/root.go | 17 ++--- server/internal/cli/serve.go | 62 +++++++++++++++++ 4 files changed, 73 insertions(+), 79 deletions(-) rename server/{cmd/server/cmd => internal/cli}/reset_admin.go (99%) rename server/{cmd/server/cmd => internal/cli}/root.go (59%) create mode 100644 server/internal/cli/serve.go diff --git a/server/cmd/server/main.go b/server/cmd/server/main.go index 3ee6544..a6072c3 100644 --- a/server/cmd/server/main.go +++ b/server/cmd/server/main.go @@ -2,69 +2,8 @@ // 启动:OT_PROXY_UPSTREAM_KEY=sk-xxx go run ./cmd/server package main -import ( - "context" - "errors" - "log" - "net/http" - "os" - "os/signal" - "strconv" - "syscall" - "time" - - "github.com/openteam/server/cmd/server/cmd" - "github.com/openteam/server/internal/api" - "github.com/openteam/server/internal/app" - "github.com/openteam/server/internal/config" - "github.com/openteam/server/internal/proxy" -) - -func init() { - cmd.DefaultRun = serve -} +import "github.com/openteam/server/internal/cli" func main() { - cmd.Execute() -} - -func serve() { - cfg, err := config.Load() - if err != nil { - log.Fatalf("config: %v", err) - } - - a, err := app.New(cfg) - if err != nil { - log.Fatalf("app init: %v", err) - } - defer a.Shutdown(context.Background()) - - gw := proxy.NewGateway(a.DB, a.Enc, a.Usage, a.Limit, cfg.RateLimit.UserRPS, cfg.Proxy.LogRaw) - router := api.NewRouter(a, gw) - - srv := &http.Server{ - Addr: ":" + strconv.Itoa(cfg.Port), - Handler: router, - ReadHeaderTimeout: 10 * time.Second, - } - - go func() { - log.Printf("openteam listening on %s (env=%s)", srv.Addr, cfg.Env) - if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - log.Fatalf("server: %v", err) - } - }() - - quit := make(chan os.Signal, 1) - signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) - <-quit - - log.Println("shutting down...") - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - if err := srv.Shutdown(ctx); err != nil { - log.Printf("server shutdown: %v", err) - } - a.Usage.Close() -} + cli.Execute() +} \ No newline at end of file diff --git a/server/cmd/server/cmd/reset_admin.go b/server/internal/cli/reset_admin.go similarity index 99% rename from server/cmd/server/cmd/reset_admin.go rename to server/internal/cli/reset_admin.go index 5f75792..178044a 100644 --- a/server/cmd/server/cmd/reset_admin.go +++ b/server/internal/cli/reset_admin.go @@ -1,5 +1,5 @@ -// Package cmd 命令行入口。 -package cmd +// Package cli 命令行入口。 +package cli import ( "crypto/rand" @@ -175,4 +175,4 @@ func randomPassword(n int) (string, error) { buf[i] = pwAlphabet[k.Int64()] } return string(buf), nil -} +} \ No newline at end of file diff --git a/server/cmd/server/cmd/root.go b/server/internal/cli/root.go similarity index 59% rename from server/cmd/server/cmd/root.go rename to server/internal/cli/root.go index 8d80c71..58cd679 100644 --- a/server/cmd/server/cmd/root.go +++ b/server/internal/cli/root.go @@ -1,13 +1,10 @@ -// Package cmd 命令行入口(Cobra 子命令分发)。 -package cmd +// Package cli 命令行入口(Cobra 子命令分发)。 +package cli import ( "github.com/spf13/cobra" ) -// DefaultRun 无子命令时的默认行为(由 main 注入服务启动函数)。 -var DefaultRun func() - // Execute 启动根命令。 func Execute() { cobra.CheckErr(rootCmd.Execute()) @@ -23,11 +20,7 @@ var rootCmd = &cobra.Command{ 子命令: reset-admin-password 重置管理员密码(交互式,无参数时自动提示)`, - Run: func(c *cobra.Command, args []string) { - if DefaultRun != nil { - DefaultRun() - } else { - _ = c.Help() - } + RunE: func(c *cobra.Command, args []string) error { + return serve() }, -} +} \ No newline at end of file diff --git a/server/internal/cli/serve.go b/server/internal/cli/serve.go new file mode 100644 index 0000000..d8ac56a --- /dev/null +++ b/server/internal/cli/serve.go @@ -0,0 +1,62 @@ +// Package cli 命令行入口。 +package cli + +import ( + "context" + "errors" + "log" + "net/http" + "os" + "os/signal" + "strconv" + "syscall" + "time" + + "github.com/openteam/server/internal/api" + "github.com/openteam/server/internal/app" + "github.com/openteam/server/internal/config" + "github.com/openteam/server/internal/proxy" +) + +// serve 启动 HTTP 服务(默认子命令)。 +func serve() error { + cfg, err := config.Load() + if err != nil { + return err + } + + a, err := app.New(cfg) + if err != nil { + return err + } + defer a.Shutdown(context.Background()) + + gw := proxy.NewGateway(a.DB, a.Enc, a.Usage, a.Limit, cfg.RateLimit.UserRPS, cfg.Proxy.LogRaw) + router := api.NewRouter(a, gw) + + srv := &http.Server{ + Addr: ":" + strconv.Itoa(cfg.Port), + Handler: router, + ReadHeaderTimeout: 10 * time.Second, + } + + go func() { + log.Printf("openteam listening on %s (env=%s)", srv.Addr, cfg.Env) + if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Fatalf("server: %v", err) + } + }() + + quit := make(chan os.Signal, 1) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + + log.Println("shutting down...") + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + log.Printf("server shutdown: %v", err) + } + a.Usage.Close() + return nil +} \ No newline at end of file