root.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package cmd
  2. import (
  3. _ "embed"
  4. "fmt"
  5. "os"
  6. "runtime"
  7. "strings"
  8. "text/template"
  9. "github.com/gookit/color"
  10. "github.com/spf13/cobra"
  11. "github.com/withfig/autocomplete-tools/integrations/cobra"
  12. "github.com/zeromicro/go-zero/tools/goctl/api"
  13. "github.com/zeromicro/go-zero/tools/goctl/bug"
  14. "github.com/zeromicro/go-zero/tools/goctl/docker"
  15. "github.com/zeromicro/go-zero/tools/goctl/env"
  16. "github.com/zeromicro/go-zero/tools/goctl/gateway"
  17. "github.com/zeromicro/go-zero/tools/goctl/internal/cobrax"
  18. "github.com/zeromicro/go-zero/tools/goctl/internal/version"
  19. "github.com/zeromicro/go-zero/tools/goctl/kube"
  20. "github.com/zeromicro/go-zero/tools/goctl/migrate"
  21. "github.com/zeromicro/go-zero/tools/goctl/model"
  22. "github.com/zeromicro/go-zero/tools/goctl/quickstart"
  23. "github.com/zeromicro/go-zero/tools/goctl/rpc"
  24. "github.com/zeromicro/go-zero/tools/goctl/tpl"
  25. "github.com/zeromicro/go-zero/tools/goctl/upgrade"
  26. )
  27. const (
  28. codeFailure = 1
  29. dash = "-"
  30. doubleDash = "--"
  31. assign = "="
  32. )
  33. var (
  34. //go:embed usage.tpl
  35. usageTpl string
  36. rootCmd = cobrax.NewCommand("goctl")
  37. )
  38. // Execute executes the given command
  39. func Execute() {
  40. os.Args = supportGoStdFlag(os.Args)
  41. if err := rootCmd.Execute(); err != nil {
  42. fmt.Println(color.Red.Render(err.Error()))
  43. os.Exit(codeFailure)
  44. }
  45. }
  46. func supportGoStdFlag(args []string) []string {
  47. copyArgs := append([]string(nil), args...)
  48. parentCmd, _, err := rootCmd.Traverse(args[:1])
  49. if err != nil { // ignore it to let cobra handle the error.
  50. return copyArgs
  51. }
  52. for idx, arg := range copyArgs[0:] {
  53. parentCmd, _, err = parentCmd.Traverse([]string{arg})
  54. if err != nil { // ignore it to let cobra handle the error.
  55. break
  56. }
  57. if !strings.HasPrefix(arg, dash) {
  58. continue
  59. }
  60. flagExpr := strings.TrimPrefix(arg, doubleDash)
  61. flagExpr = strings.TrimPrefix(flagExpr, dash)
  62. flagName, flagValue := flagExpr, ""
  63. assignIndex := strings.Index(flagExpr, assign)
  64. if assignIndex > 0 {
  65. flagName = flagExpr[:assignIndex]
  66. flagValue = flagExpr[assignIndex:]
  67. }
  68. if !isBuiltin(flagName) {
  69. // The method Flag can only match the user custom flags.
  70. f := parentCmd.Flag(flagName)
  71. if f == nil {
  72. continue
  73. }
  74. if f.Shorthand == flagName {
  75. continue
  76. }
  77. }
  78. goStyleFlag := doubleDash + flagName
  79. if assignIndex > 0 {
  80. goStyleFlag += flagValue
  81. }
  82. copyArgs[idx] = goStyleFlag
  83. }
  84. return copyArgs
  85. }
  86. func isBuiltin(name string) bool {
  87. return name == "version" || name == "help"
  88. }
  89. func init() {
  90. cobra.AddTemplateFuncs(template.FuncMap{
  91. "blue": blue,
  92. "green": green,
  93. "rpadx": rpadx,
  94. "rainbow": rainbow,
  95. })
  96. rootCmd.Version = fmt.Sprintf(
  97. "%s %s/%s", version.BuildVersion,
  98. runtime.GOOS, runtime.GOARCH)
  99. rootCmd.SetUsageTemplate(usageTpl)
  100. rootCmd.AddCommand(api.Cmd, bug.Cmd, docker.Cmd, kube.Cmd, env.Cmd, gateway.Cmd, model.Cmd)
  101. rootCmd.AddCommand(migrate.Cmd, quickstart.Cmd, rpc.Cmd, tpl.Cmd, upgrade.Cmd)
  102. rootCmd.Command.AddCommand(cobracompletefig.CreateCompletionSpecCommand())
  103. rootCmd.MustInit()
  104. }