root.go 3.2 KB

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