// Package cli provides the common boilerplate code around executing a cobra command. package cli import ( "context" "errors" "fmt" "os" "os/signal" "syscall" "github.com/spf13/cobra" "git.ifooth.com/common/pkg/version" ) var ( // SignalChan ... SignalChan = make(chan os.Signal, 1) // ErrSignal ... ErrSignal = errors.New("signal") ) // Run provides the common boilerplate code around executing a cobra command. func Run(cmd *cobra.Command) int { // 不开启 自动排序 cobra.EnableCommandSorting = false cmd.CompletionOptions.DisableDefaultCmd = true cmd.SilenceErrors = true cmd.SilenceUsage = true // 添加版本 cmd.SetVersionTemplate(`{{println .Version}}`) cmd.Version = version.GetVersion() if err := execute(cmd); err != nil { fmt.Fprintf(os.Stderr, "Error: %v\n", err) return 1 } return 0 } func execute(cmd *cobra.Command) error { ctx := context.Background() // graceful shutdown signal signal.Notify(SignalChan, syscall.SIGINT, syscall.SIGTERM) err := cmd.ExecuteContext(ctx) if err == nil { return nil } if errors.Is(err, ErrSignal) { return nil } return err }