feat: generate and deploy with path

This commit is contained in:
xuthus5 2024-01-31 02:27:21 +08:00
parent 0241b4ada2
commit f83bd237e5
Signed by: xuthus5
GPG Key ID: A23CF9620CBB55F9
7 changed files with 77 additions and 42 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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)

34
go.mod
View File

@ -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
)

View File

@ -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)
},
}

13
util_test.go Normal file
View File

@ -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)
}

View File

@ -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)
}