diff --git a/cmd/start.go b/cmd/start.go index c56ed729..8bc9b2f9 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -122,14 +122,15 @@ var startCmd = &cobra.Command{ err = studio.Load(config.Conf) if err != nil { - fmt.Println(color.RedString(L("Studio Load: %s"), err.Error())) - os.Exit(2) + // fmt.Println(color.RedString(L("Studio Load: %s"), err.Error())) + log.Error("Studio Load: %s", err.Error()) + return } err := studio.Start(config.Conf) if err != nil { - fmt.Println(color.RedString(L("Studio Start: %s"), err.Error())) - os.Exit(2) + log.Error("Studio Start: %s", err.Error()) + return } }() defer studio.Stop() @@ -140,7 +141,6 @@ var startCmd = &cobra.Command{ printConnectors(false) printStores(false) printStudio(false, host) - } // Start Tasks diff --git a/config/config.go b/config/config.go index 0c940f42..103b1cf0 100644 --- a/config/config.go +++ b/config/config.go @@ -45,16 +45,16 @@ func LoadFrom(envfile string) Config { file, err := filepath.Abs(envfile) if err != nil { - // log.Warn("Can't load env file. %s", err.Error()) - return Load() + cfg := Load() + ReloadLog() + return cfg } + // load from env godotenv.Overload(file) - // if err != nil { - // // log.Warn("Can't load env file. %s", err.Error()) - // } - - return Load() + cfg := Load() + ReloadLog() + return cfg } // Load the config @@ -131,34 +131,36 @@ func ReloadLog() { // OpenLog 打开日志 func OpenLog() { - if Conf.Log != "" { - if !filepath.IsAbs(Conf.Log) { - Conf.Log = filepath.Join(Conf.Root, Conf.Log) - } - - logfile, err := filepath.Abs(Conf.Log) - if err != nil { - log.With(log.F{"file": logfile}).Error(err.Error()) - return - } - - logpath := filepath.Dir(logfile) - if _, err := os.Stat(logpath); os.IsNotExist(err) { - if err := os.MkdirAll(logpath, os.ModePerm); err != nil { - log.With(log.F{"file": logfile}).Error(err.Error()) - return - } - } - LogOutput, err = os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) - if err != nil { - log.With(log.F{"file": logfile}).Error(err.Error()) - return - } - - log.SetOutput(LogOutput) - gin.DefaultWriter = io.MultiWriter(LogOutput) + if Conf.Log == "" { + Conf.Log = filepath.Join(Conf.Root, "logs", "application.log") } + + if !filepath.IsAbs(Conf.Log) { + Conf.Log = filepath.Join(Conf.Root, Conf.Log) + } + + logfile, err := filepath.Abs(Conf.Log) + if err != nil { + log.With(log.F{"file": logfile}).Error(err.Error()) + return + } + + logpath := filepath.Dir(logfile) + if _, err := os.Stat(logpath); os.IsNotExist(err) { + if err := os.MkdirAll(logpath, os.ModePerm); err != nil { + log.With(log.F{"file": logfile}).Error(err.Error()) + return + } + } + LogOutput, err = os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) + if err != nil { + log.With(log.F{"file": logfile}).Error(err.Error()) + return + } + + log.SetOutput(LogOutput) + gin.DefaultWriter = io.MultiWriter(LogOutput) } // CloseLog 关闭日志 diff --git a/engine/load.go b/engine/load.go index b6a2fabe..d7f14132 100644 --- a/engine/load.go +++ b/engine/load.go @@ -50,7 +50,6 @@ func Load(cfg config.Config) (err error) { err = loadApp(cfg.AppSource) if err != nil { printErr(cfg.Mode, "Load Application", err) - panic(err) } // Load Certs diff --git a/setup/check.go b/setup/check.go index 94c3a1b3..fd51af51 100644 --- a/setup/check.go +++ b/setup/check.go @@ -5,22 +5,24 @@ import ( "net" "os" "path/filepath" + "strings" "time" "github.com/yaoapp/xun/capsule" "github.com/yaoapp/yao/config" ) -// Check setup programe +// Check if the app is installed +// true: start setup, false: start app func Check() bool { - root := appRoot() - - appfile := filepath.Join(root, "app.yao") - if _, err := os.Stat(appfile); err != nil && os.IsNotExist(err) { + // check app source + if !appSourceExists() { return true } + // check env file + root := appRoot() envfile := filepath.Join(root, ".env") if _, err := os.Stat(envfile); err != nil && os.IsNotExist(err) { cfg, err := getConfig() @@ -32,6 +34,29 @@ func Check() bool { return false } +func appSourceExists() bool { + + appsource := appSource() + + if strings.HasSuffix(appsource, ".pkg") || strings.HasPrefix(appsource, "bin:") { + return true + } + + // check app.yao/app.json/app.jsonc + root := appRoot() + appfiles := []string{"app.yao", "app.json", "app.jsonc"} + exist := false + for _, appfile := range appfiles { + appfile = filepath.Join(root, appfile) + if _, err := os.Stat(appfile); err == nil { + exist = true + break + } + } + + return exist +} + // ValidateHosting host ports func ValidateHosting(option map[string]string) error { if option["YAO_PORT"] == "" { @@ -87,6 +112,10 @@ func ValidateDB(option map[string]string) error { return nil } +func appSource() string { + return os.Getenv("YAO_APP_SOURCE") +} + func appRoot() string { root := os.Getenv("YAO_ROOT") @@ -117,30 +146,32 @@ func getConfig() (config.Config, error) { func hasInstalled(cfg config.Config) bool { - switch cfg.DB.Driver { - - case "sqlite3": - if cfg.DB.Primary != nil && len(cfg.DB.Primary) > 0 { - - dbfile, err := filepath.Abs(cfg.DB.Primary[0]) - if err != nil { - return false - } - - if _, err := os.Stat(dbfile); err != nil && os.IsNotExist(err) { - return false - } - - return true - } - break - - case "mysql": - if cfg.DB.Primary != nil && len(cfg.DB.Primary) > 0 { - return true - } - break - } - return false + + // switch cfg.DB.Driver { + + // case "sqlite3": + // if cfg.DB.Primary != nil && len(cfg.DB.Primary) > 0 { + + // dbfile, err := filepath.Abs(cfg.DB.Primary[0]) + // if err != nil { + // return false + // } + + // if _, err := os.Stat(dbfile); err != nil && os.IsNotExist(err) { + // return false + // } + + // return false + // } + // break + + // case "mysql": + // if cfg.DB.Primary != nil && len(cfg.DB.Primary) > 0 { + // return true + // } + // break + // } + + // return false } diff --git a/setup/install.go b/setup/install.go index b969e5ef..a487b0d1 100644 --- a/setup/install.go +++ b/setup/install.go @@ -5,10 +5,12 @@ import ( "os" "path/filepath" "strings" + "time" "github.com/yaoapp/gou/model" "github.com/yaoapp/gou/process" "github.com/yaoapp/kun/log" + "github.com/yaoapp/yao/config" "github.com/yaoapp/yao/data" "github.com/yaoapp/yao/engine" "github.com/yaoapp/yao/widgets/app" @@ -98,12 +100,28 @@ func Install(payload map[string]map[string]string) error { return err } - err = makeMigrate(root) + cfg, err := getConfig() if err != nil { return err } - err = makeSetup(root) + // Load engine + err = engine.Load(cfg) + if err != nil { + return err + } + defer func() { + engine.Unload() + time.Sleep(time.Millisecond * 200) + }() + + // Migrage & Setup + err = makeMigrate(root, cfg) + if err != nil { + return err + } + + err = makeSetup(root, cfg) if err != nil { return err } @@ -206,16 +224,6 @@ func makeDirs(root string) error { return err } - err = os.MkdirAll(filepath.Join(root, "services"), os.ModePerm) - if err != nil && !os.IsExist(err) { - return err - } - - err = os.MkdirAll(filepath.Join(root, "studio"), os.ModePerm) - if err != nil && !os.IsExist(err) { - return err - } - err = os.MkdirAll(filepath.Join(root, "logs"), os.ModePerm) if err != nil && !os.IsExist(err) { return err @@ -231,9 +239,7 @@ func makeDirs(root string) error { func makeInit(root string) error { - // if the app.json exist ignore - file := filepath.Join("app.json") - if _, err := os.Stat(filepath.Join(root, file)); err == nil { // exists + if appSourceExists() { return nil } @@ -264,17 +270,7 @@ func makeInit(root string) error { return nil } -func makeMigrate(root string) error { - - cfg, err := getConfig() - if err != nil { - return err - } - - err = engine.Load(cfg) - if err != nil { - return err - } +func makeMigrate(root string, cfg config.Config) error { // Do Stuff Here for _, mod := range model.Models { @@ -297,17 +293,7 @@ func makeMigrate(root string) error { return nil } -func makeSetup(root string) error { - - cfg, err := getConfig() - if err != nil { - return err - } - - err = engine.Load(cfg) - if err != nil { - return err - } +func makeSetup(root string, cfg config.Config) error { if app.Setting != nil && app.Setting.Setup != "" { diff --git a/setup/setup.go b/setup/setup.go index 3a9fef2a..b33fb36f 100644 --- a/setup/setup.go +++ b/setup/setup.go @@ -137,6 +137,7 @@ func Complete() { // Stop stop the studio api server func Stop() { + engine.Unload() shutdown <- true }