root.go 2.9 KB

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