package version import ( "bytes" "encoding/json" "flag" "fmt" "os" "os/exec" "runtime" "strings" "gopkg.in/yaml.v2" "github.com/beego/bee/v2/cmd/commands" "github.com/beego/bee/v2/config" beeLogger "github.com/beego/bee/v2/logger" "github.com/beego/bee/v2/logger/colors" "github.com/beego/bee/v2/utils" ) const verboseVersionBanner string = `%s%s______ | ___ \ | |_/ / ___ ___ | ___ \ / _ \ / _ \ | |_/ /| __/| __/ \____/ \___| \___| v{{ .BeeVersion }}%s %s%s ├── GoVersion : {{ .GoVersion }} ├── GOOS : {{ .GOOS }} ├── GOARCH : {{ .GOARCH }} ├── NumCPU : {{ .NumCPU }} ├── GOPATH : {{ .GOPATH }} ├── GOROOT : {{ .GOROOT }} ├── Compiler : {{ .Compiler }} └── Published : {{ .Published }}%s ` const shortVersionBanner = `______ | ___ \ | |_/ / ___ ___ | ___ \ / _ \ / _ \ | |_/ /| __/| __/ \____/ \___| \___| v{{ .BeeVersion }} ` var CmdVersion = &commands.Command{ UsageLine: "version", Short: "Prints the current Bee version", Long: ` Prints the current Bee, Beego and Go version alongside the platform information. `, Run: versionCmd, } var outputFormat string const version = config.Version func init() { fs := flag.NewFlagSet("version", flag.ContinueOnError) fs.StringVar(&outputFormat, "o", "", "Set the output format. Either json or yaml.") CmdVersion.Flag = *fs commands.AvailableCommands = append(commands.AvailableCommands, CmdVersion) } func versionCmd(cmd *commands.Command, args []string) int { cmd.Flag.Parse(args) stdout := cmd.Out() if outputFormat != "" { runtimeInfo := RuntimeInfo{ GetGoVersion(), runtime.GOOS, runtime.GOARCH, runtime.NumCPU(), os.Getenv("GOPATH"), runtime.GOROOT(), runtime.Compiler, version, utils.GetLastPublishedTime(), } switch outputFormat { case "json": { b, err := json.MarshalIndent(runtimeInfo, "", " ") if err != nil { beeLogger.Log.Error(err.Error()) } fmt.Println(string(b)) return 0 } case "yaml": { b, err := yaml.Marshal(&runtimeInfo) if err != nil { beeLogger.Log.Error(err.Error()) } fmt.Println(string(b)) return 0 } } } coloredBanner := fmt.Sprintf(verboseVersionBanner, "\x1b[35m", "\x1b[1m", "\x1b[0m", "\x1b[32m", "\x1b[1m", "\x1b[0m") InitBanner(stdout, bytes.NewBufferString(coloredBanner)) return 0 } // ShowShortVersionBanner prints the short version banner. func ShowShortVersionBanner() { output := colors.NewColorWriter(os.Stdout) InitBanner(output, bytes.NewBufferString(colors.MagentaBold(shortVersionBanner))) } func GetGoVersion() string { var ( cmdOut []byte err error ) if cmdOut, err = exec.Command("go", "version").Output(); err != nil { beeLogger.Log.Fatalf("There was an error running 'go version' command: %s", err) } return strings.Split(string(cmdOut), " ")[2] }