framework1/framework/command/new.go

201 lines
5.3 KiB
Go
Raw Normal View History

2024-10-23 13:19:58 +08:00
package command
import (
"bytes"
"context"
"fmt"
"github.com/AlecAivazis/survey/v2"
"github.com/google/go-github/v39/github"
"github.com/spf13/cast"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
"time"
"github.com/Superdanda/hade/framework/cobra"
"github.com/Superdanda/hade/framework/util"
)
// new相关的名称
func initNewCommand() *cobra.Command {
return newCommand
}
// 创建一个新应用
var newCommand = &cobra.Command{
Use: "new",
Aliases: []string{"create", "init"},
Short: "创建一个新的应用",
RunE: func(c *cobra.Command, args []string) error {
currentPath := util.GetExecDirectory()
var name string
var folder string
var mod string
var version string
var release *github.RepositoryRelease
{
prompt := &survey.Input{
Message: "请输入目录名称:",
}
err := survey.AskOne(prompt, &name)
if err != nil {
return err
}
folder = filepath.Join(currentPath, name)
if util.Exists(folder) {
isForce := false
prompt2 := &survey.Confirm{
Message: "目录" + folder + "已经存在,是否删除重新创建?(确认后立刻执行删除操作!)",
Default: false,
}
err := survey.AskOne(prompt2, &isForce)
if err != nil {
return err
}
if isForce {
if err := os.RemoveAll(folder); err != nil {
return err
}
} else {
fmt.Println("目录已存在,创建应用失败")
return nil
}
}
}
{
prompt := &survey.Input{
Message: "请输入模块名称(go.mod中的module, 默认为文件夹名称)",
}
err := survey.AskOne(prompt, &mod)
if err != nil {
return err
}
if mod == "" {
mod = name
}
}
{
// 获取hade的版本
client := github.NewClient(nil)
prompt := &survey.Input{
Message: "请输入版本名称(参考 https://github.com/Superdanda/hade/releases默认为最新版本)",
}
err := survey.AskOne(prompt, &version)
if err != nil {
return err
}
if version != "" {
// 确认版本是否正确
release, _, err = client.Repositories.GetReleaseByTag(context.Background(), "Superdanda", "hade", version)
if err != nil || release == nil {
fmt.Println("版本不存在,创建应用失败,请参考 https://github.com/Superdanda/hade/releases")
return nil
}
}
if version == "" {
2024-10-23 17:00:42 +08:00
release, _, err = client.Repositories.GetLatestRelease(context.Background(), "Superdanda", "hade")
2024-10-23 13:19:58 +08:00
version = release.GetTagName()
}
}
fmt.Println("====================================================")
fmt.Println("开始进行创建应用操作")
fmt.Println("创建目录:", folder)
fmt.Println("应用名称:", mod)
fmt.Println("hade框架版本", release.GetTagName())
templateFolder := filepath.Join(currentPath, "template-hade-"+version+"-"+cast.ToString(time.Now().Unix()))
os.Mkdir(templateFolder, os.ModePerm)
fmt.Println("创建临时目录", templateFolder)
// 拷贝template项目
url := release.GetZipballURL()
err := util.DownloadFile(filepath.Join(templateFolder, "template.zip"), url)
if err != nil {
return err
}
fmt.Println("下载zip包到template.zip")
_, err = util.Unzip(filepath.Join(templateFolder, "template.zip"), templateFolder)
if err != nil {
return err
}
2024-10-23 17:00:42 +08:00
// 获取folder下的Superdanda-hade-xxx相关解压目录
2024-10-23 13:19:58 +08:00
fInfos, err := ioutil.ReadDir(templateFolder)
if err != nil {
return err
}
for _, fInfo := range fInfos {
// 找到解压后的文件夹
2024-10-23 17:00:42 +08:00
//if fInfo.IsDir() && strings.Contains(fInfo.Name(), "Superdanda-hade-") {
// if err := os.Rename(filepath.Join(templateFolder, fInfo.Name()), folder); err != nil {
// return err
// }
//}
if fInfo.IsDir() && strings.Contains(fInfo.Name(), "Superdanda-hade-") {
// 使用复制方法而不是重命名
if err := util.CopyDir(filepath.Join(templateFolder, fInfo.Name()), folder); err != nil {
2024-10-23 13:19:58 +08:00
return err
}
}
}
fmt.Println("解压zip包")
if err := os.RemoveAll(templateFolder); err != nil {
return err
}
fmt.Println("删除临时文件夹", templateFolder)
os.RemoveAll(path.Join(folder, ".git"))
fmt.Println("删除.git目录")
// 删除framework 目录
os.RemoveAll(path.Join(folder, "framework"))
fmt.Println("删除framework目录")
filepath.Walk(folder, func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
}
c, err := ioutil.ReadFile(path)
if err != nil {
return err
}
if path == filepath.Join(folder, "go.mod") {
fmt.Println("更新文件:" + path)
c = bytes.ReplaceAll(c, []byte("module github.com/Superdanda/hade"), []byte("module "+mod))
c = bytes.ReplaceAll(c, []byte("require ("), []byte("require (\n\tgithub.com/Superdanda/hade "+version))
err = ioutil.WriteFile(path, c, 0644)
if err != nil {
return err
}
return nil
}
isContain := bytes.Contains(c, []byte("github.com/Superdanda/hade/app"))
if isContain {
fmt.Println("更新文件:" + path)
c = bytes.ReplaceAll(c, []byte("github.com/Superdanda/hade/app"), []byte(mod+"/app"))
err = ioutil.WriteFile(path, c, 0644)
if err != nil {
return err
}
}
return nil
})
fmt.Println("创建应用结束")
fmt.Println("目录:", folder)
fmt.Println("====================================================")
return nil
},
}