[change] start command

This commit is contained in:
Max 2023-03-26 18:21:55 +08:00
parent 75ee709c23
commit 2bd41ed135
7 changed files with 69 additions and 224 deletions

View file

@ -9,7 +9,7 @@ COMMIT := $(shell git log | head -n 1 | awk '{print substr($$2, 0, 12)}')
NOW := $(shell date +"%FT%T%z") NOW := $(shell date +"%FT%T%z")
# ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) # ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
TESTFOLDER := $(shell $(GO) list ./... | grep -E 'api|model|flow|script|fs|i18n|connector|query|plugin|cert|crypto|task|schedule|runtime|helper|utils|widget|importer|store|widgets|engine' | grep -vE 'examples|tests*|config') TESTFOLDER := $(shell $(GO) list ./... | grep -E 'api|model|flow|script|fs|i18n|connector|query|plugin|cert|crypto|task|schedule|runtime|helper|utils|widget|importer|store|widgets|engine|service' | grep -vE 'examples|tests*|config')
TESTTAGS ?= "" TESTTAGS ?= ""
# TESTWIDGETS := $(shell $(GO) list ./widgets/...) # TESTWIDGETS := $(shell $(GO) list ./widgets/...)

View file

@ -12,18 +12,18 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/yaoapp/gou/api" "github.com/yaoapp/gou/api"
"github.com/yaoapp/gou/connector" "github.com/yaoapp/gou/connector"
"github.com/yaoapp/gou/fs"
"github.com/yaoapp/gou/schedule" "github.com/yaoapp/gou/schedule"
"github.com/yaoapp/gou/server/http"
"github.com/yaoapp/gou/store" "github.com/yaoapp/gou/store"
"github.com/yaoapp/gou/task" "github.com/yaoapp/gou/task"
"github.com/yaoapp/gou/websocket" "github.com/yaoapp/gou/websocket"
"github.com/yaoapp/kun/log" "github.com/yaoapp/kun/log"
"github.com/yaoapp/yao/config" "github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/engine" "github.com/yaoapp/yao/engine"
"github.com/yaoapp/yao/fs"
"github.com/yaoapp/yao/service" "github.com/yaoapp/yao/service"
"github.com/yaoapp/yao/setup" "github.com/yaoapp/yao/setup"
"github.com/yaoapp/yao/share" "github.com/yaoapp/yao/share"
"github.com/yaoapp/yao/studio"
) )
var startDebug = false var startDebug = false
@ -55,23 +55,33 @@ var startCmd = &cobra.Command{
// defer service.Stop(func() { fmt.Println(L("Service stopped")) }) // defer service.Stop(func() { fmt.Println(L("Service stopped")) })
Boot() Boot()
if startDebug { // 强制 debug 模式启动 // force debug
if startDebug {
config.Development() config.Development()
} }
mode := config.Conf.Mode // load the application engine
err := engine.Load(config.Conf) // 加载脚本等 err := engine.Load(config.Conf)
if err != nil { if err != nil {
fmt.Println(color.RedString(L("Fatal: %s"), err.Error())) fmt.Println(color.RedString(L("Fatal: %s"), err.Error()))
os.Exit(1) os.Exit(1)
} }
port := fmt.Sprintf(":%d", config.Conf.Port) port := fmt.Sprintf(":%d", config.Conf.Port)
if port == ":80" { if port == ":80" {
port = "" port = ""
} }
// variables for the service
fs, err := fs.Get("system")
if err != nil {
fmt.Println(color.RedString(L("Fatal: %s"), err.Error()))
os.Exit(1)
}
mode := config.Conf.Mode
host := config.Conf.Host host := config.Conf.Host
dataRoot, _ := fs.Root(config.Conf) dataRoot := fs.Root()
fmt.Println(color.WhiteString("\n---------------------------------")) fmt.Println(color.WhiteString("\n---------------------------------"))
fmt.Println(color.WhiteString(strings.TrimPrefix(share.App.Name, "::")), color.WhiteString(share.App.Version), mode) fmt.Println(color.WhiteString(strings.TrimPrefix(share.App.Name, "::")), color.WhiteString(share.App.Version), mode)
@ -81,8 +91,6 @@ var startCmd = &cobra.Command{
fmt.Println(color.WhiteString(L("Root")), color.GreenString(" %s", root)) fmt.Println(color.WhiteString(L("Root")), color.GreenString(" %s", root))
} }
if share.App.XGen == "1.0" {
root, _ := adminRoot() root, _ := adminRoot()
urls := []string{fmt.Sprintf("http://%s:%s", host, port)} urls := []string{fmt.Sprintf("http://%s:%s", host, port)}
if host == "0.0.0.0" { if host == "0.0.0.0" {
@ -90,7 +98,6 @@ var startCmd = &cobra.Command{
} }
fmt.Println(color.WhiteString(L("Data")), color.GreenString(" %s", dataRoot)) fmt.Println(color.WhiteString(L("Data")), color.GreenString(" %s", dataRoot))
fmt.Println(color.WhiteString(L(" XGEN")), color.GreenString(" 1.0"))
fmt.Println(color.WhiteString(L("Listening")), color.GreenString(" %s:%d", config.Conf.Host, config.Conf.Port)) fmt.Println(color.WhiteString(L("Listening")), color.GreenString(" %s:%d", config.Conf.Host, config.Conf.Port))
for _, url := range urls { for _, url := range urls {
fmt.Println(color.CyanString("\n%s", url)) fmt.Println(color.CyanString("\n%s", url))
@ -100,31 +107,18 @@ var startCmd = &cobra.Command{
fmt.Println(color.WhiteString(L("API")), color.GreenString(" %s/api", url)) fmt.Println(color.WhiteString(L("API")), color.GreenString(" %s/api", url))
} }
} else { // print the messages under the development mode
if host == "0.0.0.0" {
host = "127.0.0.1"
}
fmt.Println(color.WhiteString(L("Data")), color.GreenString(" %s", dataRoot))
fmt.Println(color.WhiteString(L("Frontend")), color.GreenString(" http://%s%s/", host, port))
fmt.Println(color.WhiteString(L("Dashboard")), color.GreenString(" http://%s%s/xiang/login/admin", host, port))
fmt.Println(color.WhiteString(L("API")), color.GreenString(" http://%s%s/api", host, port))
fmt.Println(color.WhiteString(L("Listening")), color.GreenString(" %s:%d", config.Conf.Host, config.Conf.Port))
}
// development mode
if mode == "development" { if mode == "development" {
// Start Studio Server // Start Studio Server
go func() { // go func() {
err := studio.Start(config.Conf) // err := studio.Start(config.Conf)
if err != nil { // if err != nil {
fmt.Println(color.RedString(L("Fatal: %s"), err.Error())) // fmt.Println(color.RedString(L("Fatal: %s"), err.Error()))
os.Exit(2) // os.Exit(2)
} // }
}() // }()
defer studio.Stop() // defer studio.Stop()
printApis(false) printApis(false)
printTasks(false) printTasks(false)
@ -135,14 +129,16 @@ var startCmd = &cobra.Command{
} }
// start watching
if mode == "development" && !startDisableWatching { if mode == "development" && !startDisableWatching {
// Watching // Watching
fmt.Println(color.WhiteString("\n---------------------------------")) fmt.Println(color.WhiteString("\n---------------------------------"))
fmt.Println(color.WhiteString(L("Watching"))) fmt.Println(color.WhiteString(L("Watching")))
fmt.Println(color.WhiteString("---------------------------------")) fmt.Println(color.WhiteString("---------------------------------"))
service.Watch(config.Conf) // service.Watch(config.Conf)
} }
// print the messages under the production mode
if mode == "production" { if mode == "production" {
printApis(true) printApis(true)
printTasks(true) printTasks(true)
@ -152,25 +148,28 @@ var startCmd = &cobra.Command{
} }
srv, err := service.Start(config.Conf) srv, err := service.Start(config.Conf)
defer func() {
// Start server service.Stop(srv)
go func() { fmt.Println(color.GreenString(L("✨EXITED✨")))
srv.Start()
if err != nil {
fmt.Println(color.RedString(L("Fatal: %s"), err.Error()))
os.Exit(3)
}
}() }()
defer srv.Stop()
fmt.Println(color.GreenString(L("✨LISTENING✨")))
for { for {
select { select {
case v := <-srv.Event():
switch v {
case http.READY:
fmt.Println(color.GreenString(L("✨LISTENING✨")))
break
case http.CLOSED:
fmt.Println(color.GreenString(L("✨EXITED✨")))
return
default:
fmt.Println("hello", v)
}
case <-interrupt: case <-interrupt:
// ctx, canceled := context.WithTimeout(context.Background(), (5 * time.Second))
// defer canceled()
service.Stop(srv)
return return
} }
} }

View file

@ -2,6 +2,7 @@ package config
import ( import (
"errors" "errors"
"io"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
@ -109,6 +110,11 @@ func ReloadLog() {
// OpenLog 打开日志 // OpenLog 打开日志
func OpenLog() { func OpenLog() {
if Conf.Log != "" { if Conf.Log != "" {
if !filepath.IsAbs(Conf.Log) {
Conf.Log = filepath.Join(Conf.Root, Conf.Log)
}
logfile, err := filepath.Abs(Conf.Log) logfile, err := filepath.Abs(Conf.Log)
if err != nil { if err != nil {
log.With(log.F{"file": logfile}).Error(err.Error()) log.With(log.F{"file": logfile}).Error(err.Error())
@ -129,7 +135,7 @@ func OpenLog() {
} }
log.SetOutput(LogOutput) log.SetOutput(LogOutput)
gin.DefaultWriter = LogOutput gin.DefaultWriter = io.MultiWriter(LogOutput)
} }
} }

View file

@ -1,22 +0,0 @@
package main
import (
"os"
"testing"
"github.com/yaoapp/gou/plugin"
"github.com/yaoapp/yao/config"
)
var cfg config.Config
func TestMain(m *testing.M) {
// Run test suites
exitVal := m.Run()
// we can do clean up code here
plugin.KillAll()
os.Exit(exitVal)
}

View file

@ -1,139 +0,0 @@
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"testing"
"time"
jsoniter "github.com/json-iterator/go"
"github.com/stretchr/testify/assert"
"github.com/yaoapp/kun/any"
"github.com/yaoapp/kun/maps"
"github.com/yaoapp/yao/config"
)
func TestCommandVersion(t *testing.T) {
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
os.Args = append(os.Args, "version")
assert.NotPanics(t, func() {
main()
})
}
func TestCommandMigrate(t *testing.T) {
oldArgs := os.Args
defer func() { os.Args = oldArgs }()
os.Args = append(os.Args, "migrate", "--reset", "--force")
assert.NotPanics(t, func() {
main()
})
}
func TestCommandStart(t *testing.T) {
oldArgs := os.Args
defer func() {
os.Args = oldArgs
// service.Stop(func() {})
log.Println("服务已关闭")
}()
go func() {
os.Args = append(os.Args, "start")
main()
}()
// 发送请求
request := func() (maps.MapStr, error) {
time.Sleep(time.Microsecond * 2000)
url := fmt.Sprintf("http://%s:%d/api/user/find/1?select=id,name", "127.0.0.1", config.Conf.Port)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
res := maps.MakeMapStr()
err = jsoniter.Unmarshal(body, &res)
if err != nil {
return nil, err
}
return res, nil
}
// 等待服务启动
times := 0
for times < 30 { // 2秒超时
time.Sleep(time.Second * 2)
times++
fmt.Printf("Trying(%d)...", times)
res, err := request()
if err != nil {
fmt.Printf(" %s\n", err.Error())
continue
}
assert.Equal(t, 1, any.Of(res.Get("id")).CInt())
assert.Equal(t, "管理员", res.Get("name"))
return
}
assert.True(t, false)
}
func TestCommandStop(t *testing.T) {
oldArgs := os.Args
defer func() {
os.Args = oldArgs
}()
go func() {
os.Args = append(os.Args, "start")
main()
}()
// 发送请求
request := func() (maps.MapStr, error) {
time.Sleep(time.Microsecond * 2000)
url := fmt.Sprintf("http://%s:%d/api/user/find/1?select=id,name", "127.0.0.1", config.Conf.Port)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
res := maps.MakeMapStr()
err = jsoniter.Unmarshal(body, &res)
if err != nil {
return nil, err
}
return res, nil
}
// 等待服务启动
times := 0
for times < 30 { // 2秒超时
time.Sleep(time.Second * 2)
times++
res, err := request()
if err != nil {
fmt.Println("REQUEST ERROR:", err)
continue
}
assert.Equal(t, 1, any.Of(res.Get("id")).CInt())
assert.Equal(t, "管理员", res.Get("name"))
// 测试关闭
// service.Stop(func() { log.Println("服务已关闭") })
time.Sleep(time.Second * 5)
_, err = request()
assert.NotNil(t, err)
return
}
assert.True(t, false)
}

View file

@ -23,6 +23,7 @@ func Start(cfg config.Config) (*http.Server, error) {
} }
router := gin.New() router := gin.New()
router.Use(gin.Logger())
api.SetGuards(Guards) api.SetGuards(Guards)
api.SetRoutes(router, "/api", cfg.AllowFrom...) api.SetRoutes(router, "/api", cfg.AllowFrom...)

View file

@ -16,7 +16,7 @@ func Check() bool {
root := appRoot() root := appRoot()
appfile := filepath.Join(root, "app.json") appfile := filepath.Join(root, "app.yao")
if _, err := os.Stat(appfile); err != nil && os.IsNotExist(err) { if _, err := os.Stat(appfile); err != nil && os.IsNotExist(err) {
return true return true
} }