You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-zero/tools/goctl/quickstart/mono.go

104 lines
2.7 KiB
Go

package quickstart
import (
_ "embed"
"io/ioutil"
"path/filepath"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/tools/goctl/api/gogen"
"github.com/zeromicro/go-zero/tools/goctl/pkg/golang"
"github.com/zeromicro/go-zero/tools/goctl/util"
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
)
var (
//go:embed idl/greet.api
apiContent string
//go:embed idl/svc.tpl
svcContent string
//go:embed idl/apilogic.tpl
apiLogicContent string
//go:embed idl/api.yaml
apiEtcContent string
apiWorkDir string
rpcWorkDir string
)
func initAPIFlags() error {
rpcWorkDir = filepath.Join(projectDir, "rpc")
apiWorkDir = filepath.Join(projectDir, "api")
if err := pathx.MkdirIfNotExist(apiWorkDir); err != nil {
return err
}
apiFilename := filepath.Join(apiWorkDir, "greet.api")
apiBytes := []byte(apiContent)
if err := ioutil.WriteFile(apiFilename, apiBytes, 0o666); err != nil {
return err
}
gogen.VarStringDir = apiWorkDir
gogen.VarStringAPI = apiFilename
return nil
}
type mono struct {
callRPC bool
}
func newMonoService(callRPC bool) mono {
m := mono{callRPC}
m.createAPIProject()
return m
}
func (m mono) createAPIProject() {
logx.Must(initAPIFlags())
log.Debug(">> Generating quickstart api project...")
logx.Must(gogen.GoCommand(nil, nil))
etcFile := filepath.Join(apiWorkDir, "etc", "greet.yaml")
logx.Must(ioutil.WriteFile(etcFile, []byte(apiEtcContent), 0o666))
logicFile := filepath.Join(apiWorkDir, "internal", "logic", "pinglogic.go")
svcFile := filepath.Join(apiWorkDir, "internal", "svc", "servicecontext.go")
configPath := filepath.Join(apiWorkDir, "internal", "config")
svcPath := filepath.Join(apiWorkDir, "internal", "svc")
typesPath := filepath.Join(apiWorkDir, "internal", "types")
svcPkg, err := golang.GetParentPackage(svcPath)
logx.Must(err)
typesPkg, err := golang.GetParentPackage(typesPath)
logx.Must(err)
configPkg, err := golang.GetParentPackage(configPath)
logx.Must(err)
var rpcClientPkg string
if m.callRPC {
rpcClientPath := filepath.Join(rpcWorkDir, "greet")
rpcClientPkg, err = golang.GetParentPackage(rpcClientPath)
logx.Must(err)
}
logx.Must(util.With("logic").Parse(apiLogicContent).SaveTo(map[string]any{
"svcPkg": svcPkg,
"typesPkg": typesPkg,
"rpcClientPkg": rpcClientPkg,
"callRPC": m.callRPC,
}, logicFile, true))
logx.Must(util.With("svc").Parse(svcContent).SaveTo(map[string]any{
"rpcClientPkg": rpcClientPkg,
"configPkg": configPkg,
"callRPC": m.callRPC,
}, svcFile, true))
}
func (m mono) start() {
if !m.callRPC {
goModTidy(projectDir)
}
log.Debug(">> Ready to start an API server...")
log.Debug(">> Run 'curl http://127.0.0.1:8888/ping' after service startup...")
goStart(apiWorkDir)
}