package env import ( "fmt" "strings" "time" "github.com/urfave/cli" "github.com/zeromicro/go-zero/tools/goctl/pkg/env" "github.com/zeromicro/go-zero/tools/goctl/pkg/protoc" "github.com/zeromicro/go-zero/tools/goctl/pkg/protocgengo" "github.com/zeromicro/go-zero/tools/goctl/pkg/protocgengogrpc" "github.com/zeromicro/go-zero/tools/goctl/util/console" ) type bin struct { name string exists bool get func(cacheDir string) (string, error) } var bins = []bin{ { name: "protoc", exists: protoc.Exists(), get: protoc.Install, }, { name: "protoc-gen-go", exists: protocgengo.Exists(), get: protocgengo.Install, }, { name: "protoc-gen-go-grpc", exists: protocgengogrpc.Exists(), get: protocgengogrpc.Install, }, } func Check(ctx *cli.Context) error { install := ctx.Bool("install") force := ctx.Bool("force") return check(install, force) } func check(install, force bool) error { var pending = true console.Info("[goctl-env]: preparing to check env") defer func() { if p := recover(); p != nil { console.Error("%+v", p) return } if pending { console.Success("\n[goctl-env]: congratulations! your goctl environment is ready!") } else { console.Error(` [goctl-env]: check env finish, some dependencies is not found in PATH, you can execute command 'goctl env check --install' or 'goctl env install' to install it, for details, please see 'goctl env check --help' or 'goctl env install --help'`) } }() for _, e := range bins { time.Sleep(200 * time.Millisecond) console.Info("") console.Info("[goctl-env]: looking up %q", e.name) if e.exists { console.Success("[goctl-env]: %q is installed", e.name) continue } console.Warning("[goctl-env]: %q is not found in PATH", e.name) if install { install := func() { console.Info("[goctl-env]: preparing to install %q", e.name) path, err := e.get(env.Get(env.GoctlCache)) if err != nil { console.Error("[goctl-env]: an error interrupted the installation: %+v", err) pending = false } else { console.Success("[goctl-env]: %q is already installed in %q", e.name, path) } } if force { install() continue } console.Info("[goctl-env]: do you want to install %q [y: YES, n: No]", e.name) for { var in string fmt.Scanln(&in) var brk bool switch { case strings.EqualFold(in, "y"): install() brk = true case strings.EqualFold(in, "n"): pending = false console.Info("[goctl-env]: %q installation is ignored", e.name) brk = true default: console.Error("[goctl-env]: invalid input, input 'y' for yes, 'n' for no") } if brk { break } } } else { pending = false } } return nil }