From f83bd237e5888261bd1346b1199b1d10daeb1a6c Mon Sep 17 00:00:00 2001 From: xuthus5 Date: Wed, 31 Jan 2024 02:27:21 +0800 Subject: [PATCH] feat: generate and deploy with path --- config.go | 8 +++++++- deploy_command.go | 14 +++++++++++--- generate_command.go | 41 +++++++++++++++++++++++------------------ go.mod | 34 +++++++++++++++++----------------- update_command.go | 2 +- util_test.go | 13 +++++++++++++ utils.go | 7 +++++-- 7 files changed, 77 insertions(+), 42 deletions(-) create mode 100644 util_test.go diff --git a/config.go b/config.go index 9f66aca..4f26eaa 100644 --- a/config.go +++ b/config.go @@ -81,8 +81,14 @@ type Config struct { Deploy Deploy `yaml:"deploy"` // 部署配置 } +var BaseDir string + func (c *Config) load() error { - configBuffer, err := os.ReadFile("config.yaml") + var file = "config.yaml" + if BaseDir != "" { + file = BaseDir + "/config.yaml" + } + configBuffer, err := os.ReadFile(file) if err != nil { logger.Errorf("read config file failed: %v", err) return err diff --git a/deploy_command.go b/deploy_command.go index d27b283..e286d03 100644 --- a/deploy_command.go +++ b/deploy_command.go @@ -1,14 +1,22 @@ package main -import "github.com/spf13/cobra" +import ( + "github.com/spf13/cobra" + "strings" +) func deployCmd() *cobra.Command { + var path string var outter Outter cmd := &cobra.Command{ Use: "deploy", Aliases: []string{"d"}, Short: "deploy project to upyun", PreRun: func(cmd *cobra.Command, args []string) { + if path != "" { + BaseDir = strings.TrimSuffix(path, "/") + } + if err := outter.loadConfig(); err != nil { logger.Fatalf("load config failed: %v", err) } @@ -38,7 +46,7 @@ func deployCmd() *cobra.Command { logger.Errorf("please config upyun auth string: upx auth [bucket] [operator] [password]") return } - if err := uploadToUpyun(config.UpyunAuth); err != nil { + if err := uploadToUpyun(config.UpyunAuth, path); err != nil { logger.Errorf("upload dist to upyun failed: %v", err) return } @@ -46,6 +54,6 @@ func deployCmd() *cobra.Command { } }, } - + cmd.Flags().StringVar(&path, "path", ".", "mder project path") return cmd } diff --git a/generate_command.go b/generate_command.go index abd77dc..cadd554 100644 --- a/generate_command.go +++ b/generate_command.go @@ -22,11 +22,15 @@ import ( func generateCmd() *cobra.Command { var startAt time.Time var outter = newOutter() + var path string cmd := &cobra.Command{ Use: "generate", Aliases: []string{"g"}, Short: "generate project to dist folder", PreRun: func(cmd *cobra.Command, args []string) { + if path != "" { + BaseDir = strings.TrimSuffix(path, "/") + } startAt = time.Now() // 读取配置文件 if err := outter.loadConfig(); err != nil { @@ -62,12 +66,13 @@ func generateCmd() *cobra.Command { logger.Infof("generate used: %s", endAt.String()) }, } + cmd.Flags().StringVar(&path, "path", ".", "mder project path") return cmd } // readAllPosts 读取所有post文章 func (o *Outter) readAllPosts() error { - const postDir = "./posts" + var postDir = BaseDir + "/posts" dirs, err := os.ReadDir(postDir) if err != nil { logger.Errorf("read directory failed: %v", err) @@ -215,7 +220,7 @@ func (o *Outter) readPosts(base, category string) []*Post { } func (o *Outter) readAllPages() error { - var dir = "./pages" + var dir = BaseDir + "/pages" dirs, err := os.ReadDir(dir) if err != nil { logger.Errorf("read directory failed: %v", err) @@ -241,7 +246,7 @@ func (o *Outter) readAllPages() error { func (o *Outter) readTheme(themeName string) (err error) { o.Theme = new(Theme) - var dir = fmt.Sprintf("./themes/%s", themeName) + var dir = fmt.Sprintf("%s/themes/%s", BaseDir, themeName) o.Theme.BaseLayout, err = os.ReadFile(fmt.Sprintf("%s/base.html", dir)) if err != nil { logger.Errorf("read base.html theme file failed: %v", err) @@ -350,7 +355,7 @@ func (o *Outter) loadConfig() error { // readDataSource 读取资源文件 func (o *Outter) readDataSource() error { o.SourceData = make(map[string]interface{}) - const dataDir = "./data" + var dataDir = BaseDir + "/data" dirs, err := os.ReadDir(dataDir) if err != nil { return nil @@ -401,12 +406,12 @@ func (o *Outter) generate() { // clearDistDirectory 清理dist目录 func (o *Outter) clearDistDirectory() error { - if err := os.RemoveAll("./dist"); err != nil { + if err := os.RemoveAll(BaseDir + "/dist"); err != nil { logger.Errorf("remove old dist directory failed: %v", err) return err } - if err := mkdir("./dist"); err != nil { + if err := mkdir(BaseDir + "/dist"); err != nil { logger.Errorf("create dist directory failed: %v", err) return err } @@ -415,8 +420,8 @@ func (o *Outter) clearDistDirectory() error { // sourceCopy 资源拷贝 将主题的资源拷贝到目标文件夹中 func (o *Outter) sourceCopy() error { - sourcePath := slash(fmt.Sprintf("./themes/%s/", o.Config.Site.Theme)) - destPath := slash("./dist/" + o.SourceVersion + "/") + sourcePath := slash(fmt.Sprintf(BaseDir+"/themes/%s/", o.Config.Site.Theme)) + destPath := slash(BaseDir + "/dist/" + o.SourceVersion + "/") // mkdir cssDir := fmt.Sprintf("%s/css", destPath) jsDir := fmt.Sprintf("%s/js", destPath) @@ -478,7 +483,7 @@ func (o *Outter) generateIndex() error { logger.Errorf("generate index page failed: %v", err) return err } - var filename = "./dist/index.html" + var filename = BaseDir + "/dist/index.html" if err := os.WriteFile(filename, buffer.Bytes(), os.ModePerm); err != nil { logger.Errorf("write index file failed: %v", err) return err @@ -515,18 +520,18 @@ func (o *Outter) generateIndex() error { // 第一页 主页 if i == 0 { // 第一次的时候创建目录 - dir := "./dist/page" + dir := BaseDir + "/dist/page" if err := o.createDir(dir); err != nil { logger.Errorf("create index page failed: %v", err) return err } - var filename = "./dist/index.html" + var filename = BaseDir + "/dist/index.html" if err := os.WriteFile(filename, buffer.Bytes(), os.ModePerm); err != nil { logger.Errorf("write index file failed: %v", err) return err } } - fPage := fmt.Sprintf("./dist/page/%d.html", i+1) + fPage := fmt.Sprintf(BaseDir+"/dist/page/%d.html", i+1) if err := os.WriteFile(fPage, buffer.Bytes(), os.ModePerm); err != nil { logger.Errorf("write index file failed: %v", err) return err @@ -565,7 +570,7 @@ func (o *Outter) generatePost() { return } // buffer写文件 - var catDir = fmt.Sprintf("./dist/%s", post.Category) + var catDir = fmt.Sprintf(BaseDir+"/dist/%s", post.Category) if !isExist(catDir) { if err := mkdir(catDir); err != nil { logger.Errorf("create directory failed: %v", err) @@ -608,7 +613,7 @@ func (o *Outter) generateDraftPost() { return } // buffer写文件 - var catDir = "./dist/draft" + var catDir = BaseDir + "/dist/draft" if !isExist(catDir) { if err := mkdir(catDir); err != nil { logger.Errorf("create directory failed: %v", err) @@ -651,7 +656,7 @@ func (o *Outter) generatePage() { return } // buffer写文件 - var filename = fmt.Sprintf("./dist/%s.html", page.Link) + var filename = fmt.Sprintf(BaseDir+"/dist/%s.html", page.Link) if err := os.WriteFile(filename, pageBuffer.Bytes(), os.ModePerm); err != nil { logger.Errorf("write page content failed: %v", err) return @@ -711,7 +716,7 @@ func (o *Outter) generateArchives() { return } // buffer写文件 - var filename = fmt.Sprintf("./dist/%s.html", instance.Page.Link) + var filename = fmt.Sprintf(BaseDir+"/dist/%s.html", instance.Page.Link) if err := os.WriteFile(filename, archiveBuffer.Bytes(), os.ModePerm); err != nil { logger.Errorf("write archive page failed: %v", err) return @@ -782,7 +787,7 @@ func (o *Outter) generateTags() { return } // 创建tag文件夹 - var tagDir = "./dist/tags" + var tagDir = BaseDir + "/dist/tags" if !isExist(tagDir) { if err := mkdir(tagDir); err != nil { logger.Errorf("create tag directory failed: %v", err) @@ -860,7 +865,7 @@ func (o *Outter) generateCategories() { return } // 创建tag文件夹 - var tagDir = "./dist/category" + var tagDir = BaseDir + "/dist/category" if !isExist(tagDir) { if err := mkdir(tagDir); err != nil { logger.Errorf("create tag directory failed: %v", err) diff --git a/go.mod b/go.mod index 20ab038..c5a5702 100644 --- a/go.mod +++ b/go.mod @@ -4,46 +4,46 @@ go 1.20 require ( github.com/gin-gonic/gin v1.9.1 - github.com/guonaihong/gout v0.3.8 + github.com/guonaihong/gout v0.3.9 github.com/radovskyb/watcher v1.0.7 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 github.com/yuin/goldmark v1.6.0 github.com/yuin/goldmark-emoji v1.0.2 github.com/yuin/goldmark-meta v1.1.0 - go.abhg.dev/goldmark/mermaid v0.4.0 - go.abhg.dev/goldmark/toc v0.7.0 + go.abhg.dev/goldmark/mermaid v0.5.0 + go.abhg.dev/goldmark/toc v0.9.0 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/andybalholm/brotli v1.0.6 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect github.com/bytedance/sonic v1.10.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect - github.com/chenzhuoyu/iasm v0.9.0 // indirect + github.com/chenzhuoyu/iasm v0.9.1 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.15.5 // indirect + github.com/go-playground/validator/v10 v10.17.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/leodido/go-urn v1.2.4 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/leodido/go-urn v1.3.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect - golang.org/x/arch v0.5.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + golang.org/x/arch v0.7.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/update_command.go b/update_command.go index ac9051f..7335c06 100644 --- a/update_command.go +++ b/update_command.go @@ -27,7 +27,7 @@ func updateCmd() *cobra.Command { logger.Errorf("install: go install %s\nupdate failed: %v\n", url, err) return } - logger.Info("mder %s update success", commit.Sha) + logger.Infof("mder %s update success", commit.Sha) }, } diff --git a/util_test.go b/util_test.go new file mode 100644 index 0000000..6ba5a9c --- /dev/null +++ b/util_test.go @@ -0,0 +1,13 @@ +package main + +import ( + "fmt" + "strings" + "testing" +) + +func TestTrim(t *testing.T) { + var a = "/tmp/blog/" + a = strings.TrimSuffix(a, "/") + fmt.Println(a) +} diff --git a/utils.go b/utils.go index c07237c..34ed8d6 100644 --- a/utils.go +++ b/utils.go @@ -90,12 +90,15 @@ func goInstall(pkg string) error { return err } -func uploadToUpyun(auth string) error { +func uploadToUpyun(auth, dir string) error { + if strings.HasSuffix(dir, "/") { + dir = strings.TrimSuffix(dir, "/") + } _, err := exec.Command("upx", "--auth", auth, "rm", "-d", "-a", "/*").Output() if err != nil { return fmt.Errorf("remove old data failed: %v", err) } - _, err = exec.Command("upx", "--auth", auth, "put", "./dist/.", "/").Output() + _, err = exec.Command("upx", "--auth", auth, "put", dir+"/dist/.", "/").Output() if err != nil { return fmt.Errorf("deploy data failed: %v", err) }