2023-02-23 17:53:04 +08:00
|
|
|
|
package addons
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
"github.com/gogf/gf/v2/os/gfile"
|
|
|
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
|
|
|
"hotgo/internal/consts"
|
|
|
|
|
"hotgo/internal/model"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Build 构建新插件
|
|
|
|
|
func Build(ctx context.Context, sk Skeleton, conf *model.BuildAddonConfig) (err error) {
|
2023-02-26 14:18:22 +08:00
|
|
|
|
var (
|
|
|
|
|
buildPath = "./" + consts.AddonsDir + "/" + sk.Name
|
|
|
|
|
modulesPath = "./" + consts.AddonsDir + "/modules/" + sk.Name + ".go"
|
|
|
|
|
templatePath = gstr.Replace(conf.TemplatePath, "{$name}", sk.Name)
|
|
|
|
|
webApiPath = gstr.Replace(conf.WebApiPath, "{$name}", sk.Name)
|
|
|
|
|
webViewsPath = gstr.Replace(conf.WebViewsPath, "{$name}", sk.Name)
|
|
|
|
|
replaces = map[string]string{
|
|
|
|
|
"@{.label}": sk.Label,
|
|
|
|
|
"@{.name}": sk.Name,
|
|
|
|
|
"@{.group}": strconv.Itoa(sk.Group),
|
|
|
|
|
"@{.brief}": sk.Brief,
|
|
|
|
|
"@{.description}": sk.Description,
|
|
|
|
|
"@{.author}": sk.Author,
|
|
|
|
|
"@{.version}": sk.Version,
|
|
|
|
|
}
|
|
|
|
|
)
|
2023-02-23 17:53:04 +08:00
|
|
|
|
|
2023-02-26 14:18:22 +08:00
|
|
|
|
if err = checkBuildDir(buildPath, modulesPath, templatePath, webApiPath, webViewsPath); err != nil {
|
2023-02-23 17:53:04 +08:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// scans directory recursively
|
|
|
|
|
list, err := gfile.ScanDirFunc(conf.SrcPath, "*", true, func(path string) string {
|
|
|
|
|
return path
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
for _, path := range list {
|
|
|
|
|
if !gfile.IsReadable(path) {
|
|
|
|
|
err = fmt.Errorf("file:%v is unreadable, please check permissions", path)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if gfile.IsDir(path) {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
flowFile := gstr.ReplaceByMap(path, map[string]string{
|
|
|
|
|
gfile.RealPath(conf.SrcPath): "",
|
|
|
|
|
".template": "",
|
|
|
|
|
})
|
|
|
|
|
flowFile = buildPath + "/" + flowFile
|
|
|
|
|
|
|
|
|
|
content := gstr.ReplaceByMap(gfile.GetContents(path), replaces)
|
|
|
|
|
|
|
|
|
|
if err = gfile.PutContents(flowFile, content); err != nil {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-26 14:18:22 +08:00
|
|
|
|
// 隐式注入插件
|
|
|
|
|
if err = gfile.PutContents(modulesPath, gstr.ReplaceByMap(importModules, replaces)); err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// home默认页面
|
|
|
|
|
if err = gfile.PutContents(templatePath+"/home/index.html", gstr.ReplaceByMap(homeLayout, replaces)); err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// webApi
|
|
|
|
|
if err = gfile.PutContents(webApiPath+"/config/index.ts", gstr.ReplaceByMap(webApiLayout, replaces)); err != nil {
|
2023-02-23 17:53:04 +08:00
|
|
|
|
return
|
|
|
|
|
}
|
2023-02-26 14:18:22 +08:00
|
|
|
|
|
|
|
|
|
// web插件配置主页面
|
|
|
|
|
if err = gfile.PutContents(webViewsPath+"/config/BasicSetting.vue", gstr.ReplaceByMap(webConfigBasicSetting, replaces)); err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// web插件基础配置页面
|
|
|
|
|
if err = gfile.PutContents(webViewsPath+"/config/system.vue", gstr.ReplaceByMap(webConfigSystem, replaces)); err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-23 17:53:04 +08:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func checkBuildDir(paths ...string) error {
|
|
|
|
|
if len(paths) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, path := range paths {
|
|
|
|
|
if gfile.Exists(path) {
|
|
|
|
|
return fmt.Errorf("插件已存在,请换一个插件名称或者经确认无误后依次删除文件夹: [%v] 后重新生成", strings.Join(paths, "、\t"))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|