You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.3 KiB
146 lines
3.3 KiB
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
// project project config
|
|
type project struct {
|
|
Name string
|
|
Owner string
|
|
Path string
|
|
WithGRPC bool
|
|
Here bool
|
|
ModuleName string // 支持项目的自定义module名 (go.mod init)
|
|
}
|
|
|
|
const (
|
|
_tplTypeDao = iota
|
|
_tplTypeHTTPServer
|
|
_tplTypeAPIProto
|
|
_tplTypeService
|
|
_tplTypeMain
|
|
_tplTypeChangeLog
|
|
_tplTypeContributors
|
|
_tplTypeReadme
|
|
_tplTypeAppToml
|
|
_tplTypeMySQLToml
|
|
_tplTypeMCToml
|
|
_tplTypeRedisToml
|
|
_tplTypeHTTPToml
|
|
_tplTypeGRPCToml
|
|
_tplTypeModel
|
|
_tplTypeGRPCServer
|
|
_tplTypeGomod
|
|
_tplTypeAPIGogen
|
|
)
|
|
|
|
var (
|
|
p project
|
|
// files type => path
|
|
files = map[int]string{
|
|
// init doc
|
|
_tplTypeChangeLog: "/CHANGELOG.md",
|
|
_tplTypeContributors: "/CONTRIBUTORS.md",
|
|
_tplTypeReadme: "/README.md",
|
|
// init project
|
|
_tplTypeGomod: "/go.mod",
|
|
_tplTypeMain: "/cmd/main.go",
|
|
_tplTypeDao: "/internal/dao/dao.go",
|
|
_tplTypeHTTPServer: "/internal/server/http/server.go",
|
|
_tplTypeService: "/internal/service/service.go",
|
|
_tplTypeModel: "/internal/model/model.go",
|
|
// init config
|
|
_tplTypeAppToml: "/configs/application.toml",
|
|
_tplTypeMySQLToml: "/configs/mysql.toml",
|
|
_tplTypeMCToml: "/configs/memcache.toml",
|
|
_tplTypeRedisToml: "/configs/redis.toml",
|
|
_tplTypeHTTPToml: "/configs/http.toml",
|
|
_tplTypeGRPCToml: "/configs/grpc.toml",
|
|
}
|
|
// tpls type => content
|
|
tpls = map[int]string{
|
|
_tplTypeDao: _tplDao,
|
|
_tplTypeHTTPServer: _tplHTTPServer,
|
|
_tplTypeAPIProto: _tplAPIProto,
|
|
_tplTypeMain: _tplMain,
|
|
_tplTypeService: _tplService,
|
|
_tplTypeChangeLog: _tplChangeLog,
|
|
_tplTypeContributors: _tplContributors,
|
|
_tplTypeReadme: _tplReadme,
|
|
_tplTypeMySQLToml: _tplMySQLToml,
|
|
_tplTypeMCToml: _tplMCToml,
|
|
_tplTypeRedisToml: _tplRedisToml,
|
|
_tplTypeAppToml: _tplAppToml,
|
|
_tplTypeHTTPToml: _tplHTTPToml,
|
|
_tplTypeModel: _tplModel,
|
|
_tplTypeGomod: _tplGoMod,
|
|
_tplTypeAPIGogen: _tplGogen,
|
|
}
|
|
)
|
|
|
|
func create() (err error) {
|
|
if p.WithGRPC {
|
|
files[_tplTypeGRPCServer] = "/internal/server/grpc/server.go"
|
|
files[_tplTypeAPIProto] = "/api/api.proto"
|
|
files[_tplTypeAPIGogen] = "/api/generate.go"
|
|
tpls[_tplTypeHTTPServer] = _tplPBHTTPServer
|
|
tpls[_tplTypeGRPCServer] = _tplGRPCServer
|
|
tpls[_tplTypeGRPCToml] = _tplGRPCToml
|
|
tpls[_tplTypeService] = _tplGPRCService
|
|
tpls[_tplTypeMain] = _tplGRPCMain
|
|
}
|
|
if err = os.MkdirAll(p.Path, 0755); err != nil {
|
|
return
|
|
}
|
|
for t, v := range files {
|
|
i := strings.LastIndex(v, "/")
|
|
if i > 0 {
|
|
dir := v[:i]
|
|
if err = os.MkdirAll(p.Path+dir, 0755); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if err = write(p.Path+v, tpls[t]); err != nil {
|
|
return
|
|
}
|
|
}
|
|
if p.WithGRPC {
|
|
if err = genpb(); err != nil {
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func genpb() error {
|
|
cmd := exec.Command("kratos", "tool", "protoc", p.Name+"/api/api.proto")
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
func write(name, tpl string) (err error) {
|
|
data, err := parse(tpl)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return ioutil.WriteFile(name, data, 0644)
|
|
}
|
|
|
|
func parse(s string) ([]byte, error) {
|
|
t, err := template.New("").Parse(s)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var buf bytes.Buffer
|
|
if err = t.Execute(&buf, p); err != nil {
|
|
return nil, err
|
|
}
|
|
return buf.Bytes(), nil
|
|
}
|
|
|