215 lines
5.2 KiB
Go
215 lines
5.2 KiB
Go
|
package command
|
|||
|
|
|||
|
import (
|
|||
|
"bytes"
|
|||
|
"fmt"
|
|||
|
"github.com/AlecAivazis/survey/v2"
|
|||
|
"github.com/Superdanda/hade/framework/cobra"
|
|||
|
"github.com/Superdanda/hade/framework/contract"
|
|||
|
"github.com/Superdanda/hade/framework/util"
|
|||
|
"github.com/go-git/go-git/v5"
|
|||
|
"github.com/jianfengye/collection"
|
|||
|
"github.com/pkg/errors"
|
|||
|
"io/ioutil"
|
|||
|
"os"
|
|||
|
"path"
|
|||
|
"path/filepath"
|
|||
|
"strings"
|
|||
|
"text/template"
|
|||
|
)
|
|||
|
|
|||
|
// 初始化中间件相关命令
|
|||
|
func initMiddlewareCommand() *cobra.Command {
|
|||
|
middlewareCommand.AddCommand(middlewareAllCommand)
|
|||
|
middlewareCommand.AddCommand(middlewareMigrateCommand)
|
|||
|
middlewareCommand.AddCommand(middlewareCreateCommand)
|
|||
|
return middlewareCommand
|
|||
|
}
|
|||
|
|
|||
|
// middlewareCommand 中间件二级命令
|
|||
|
var middlewareCommand = &cobra.Command{
|
|||
|
Use: "middleware",
|
|||
|
Short: "中间件相关命令",
|
|||
|
RunE: func(c *cobra.Command, args []string) error {
|
|||
|
if len(args) == 0 {
|
|||
|
c.Help()
|
|||
|
}
|
|||
|
return nil
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
// middlewareAllCommand 显示所有安装的中间件
|
|||
|
var middlewareAllCommand = &cobra.Command{
|
|||
|
Use: "list",
|
|||
|
Short: "显示所有中间件",
|
|||
|
RunE: func(c *cobra.Command, args []string) error {
|
|||
|
container := c.GetContainer()
|
|||
|
appService := container.MustMake(contract.AppKey).(contract.App)
|
|||
|
|
|||
|
middlewarePath := path.Join(appService.BaseFolder(), "app", "http", "middleware")
|
|||
|
|
|||
|
// 读取文件夹
|
|||
|
files, err := ioutil.ReadDir(middlewarePath)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
for _, f := range files {
|
|||
|
if f.IsDir() {
|
|||
|
fmt.Println(f.Name())
|
|||
|
}
|
|||
|
}
|
|||
|
return nil
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
var middlewareMigrateCommand = &cobra.Command{
|
|||
|
Use: "migrate",
|
|||
|
Short: "迁移gin-contrib中间件, 迁移地址:https://github.com/gin-contrib/[middleware].git",
|
|||
|
RunE: func(c *cobra.Command, args []string) error {
|
|||
|
container := c.GetContainer()
|
|||
|
fmt.Println("迁移一个Gin中间件")
|
|||
|
var repo string
|
|||
|
{
|
|||
|
prompt := &survey.Input{
|
|||
|
Message: "请输入中间件名称:",
|
|||
|
}
|
|||
|
err := survey.AskOne(prompt, &repo)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
}
|
|||
|
// step2 : 下载git到一个目录中
|
|||
|
appService := container.MustMake(contract.AppKey).(contract.App)
|
|||
|
|
|||
|
middlewarePath := appService.MiddlewareFolder()
|
|||
|
url := "https://github.com/gin-contrib/" + repo + ".git"
|
|||
|
fmt.Println("下载中间件 gin-contrib:")
|
|||
|
fmt.Println(url)
|
|||
|
_, err := git.PlainClone(path.Join(middlewarePath, repo), false, &git.CloneOptions{
|
|||
|
URL: url,
|
|||
|
Progress: os.Stdout,
|
|||
|
})
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
|
|||
|
// step3:删除不必要的文件 go.mod, go.sum, .git
|
|||
|
repoFolder := path.Join(middlewarePath, repo)
|
|||
|
fmt.Println("remove " + path.Join(repoFolder, "go.mod"))
|
|||
|
os.Remove(path.Join(repoFolder, "go.mod"))
|
|||
|
fmt.Println("remove " + path.Join(repoFolder, "go.sum"))
|
|||
|
os.Remove(path.Join(repoFolder, "go.sum"))
|
|||
|
fmt.Println("remove " + path.Join(repoFolder, ".git"))
|
|||
|
os.RemoveAll(path.Join(repoFolder, ".git"))
|
|||
|
|
|||
|
// step4 : 替换关键词
|
|||
|
filepath.Walk(repoFolder, func(path string, info os.FileInfo, err error) error {
|
|||
|
if info.IsDir() {
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
if filepath.Ext(path) != ".go" {
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
c, err := ioutil.ReadFile(path)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
isContain := bytes.Contains(c, []byte("github.com/gin-gonic/gin"))
|
|||
|
if isContain {
|
|||
|
fmt.Println("更新文件:" + path)
|
|||
|
c = bytes.ReplaceAll(c, []byte("github.com/gin-gonic/gin"), []byte("github.com/Superdanda/hade/framework/gin"))
|
|||
|
err = ioutil.WriteFile(path, c, 0644)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return nil
|
|||
|
})
|
|||
|
return nil
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
var middlewareCreateCommand = &cobra.Command{
|
|||
|
Use: "new",
|
|||
|
Aliases: []string{"create", "init"},
|
|||
|
Short: "创建一个中间件",
|
|||
|
RunE: func(c *cobra.Command, args []string) error {
|
|||
|
container := c.GetContainer()
|
|||
|
fmt.Println("创建一个中间件")
|
|||
|
var name string
|
|||
|
var folder string
|
|||
|
{
|
|||
|
prompt := &survey.Input{
|
|||
|
Message: "请输入中间件名称:",
|
|||
|
}
|
|||
|
err := survey.AskOne(prompt, &name)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
}
|
|||
|
{
|
|||
|
prompt := &survey.Input{
|
|||
|
Message: "请输入中间件所在目录名称(默认: 同中间件名称):",
|
|||
|
}
|
|||
|
err := survey.AskOne(prompt, &folder)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if folder == "" {
|
|||
|
folder = name
|
|||
|
}
|
|||
|
|
|||
|
app := container.MustMake(contract.AppKey).(contract.App)
|
|||
|
|
|||
|
pFolder := app.MiddlewareFolder()
|
|||
|
subFolders, err := util.SubDir(pFolder)
|
|||
|
if err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
subColl := collection.NewStrCollection(subFolders)
|
|||
|
if subColl.Contains(folder) {
|
|||
|
fmt.Println("目录已经存在")
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
// 开始创建文件
|
|||
|
if err := os.Mkdir(filepath.Join(pFolder, folder), 0700); err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
funcs := template.FuncMap{"title": strings.Title}
|
|||
|
{
|
|||
|
// 创建
|
|||
|
file := filepath.Join(pFolder, folder, "middleware.go")
|
|||
|
f, err := os.Create(file)
|
|||
|
if err != nil {
|
|||
|
return errors.Cause(err)
|
|||
|
}
|
|||
|
|
|||
|
t := template.Must(template.New("middleware").Funcs(funcs).Parse(middlewareTmp))
|
|||
|
if err := t.Execute(f, name); err != nil {
|
|||
|
return errors.Cause(err)
|
|||
|
}
|
|||
|
}
|
|||
|
fmt.Println("创建中间件成功, 文件夹地址:", filepath.Join(pFolder, folder))
|
|||
|
return nil
|
|||
|
},
|
|||
|
}
|
|||
|
|
|||
|
var middlewareTmp = `package {{.}}
|
|||
|
|
|||
|
import "github.com/gohade/hade/framework/gin"
|
|||
|
|
|||
|
// {{.|title}}Middleware 代表中间件函数
|
|||
|
func {{.|title}}Middleware() gin.HandlerFunc {
|
|||
|
return func(context *gin.Context) {
|
|||
|
context.Next()
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
`
|