HugoHugomarkdownHugo
GolanggolangHugo
The world’s fastest framework for building websites. Hugo 是一个非常受欢迎的、开源的静态网站生成工具。它速度快,扩展性强。
1.为什么要写一个 Hugo 发布器
事情的起因
我最初使用的是maupassant主题作为博客网站的主题,但是偶然间发现了其在移动端的适配效果不太理想,然后就想着去找一款能够完美适配移动设备的主题,最后通过配置服务器去判断用户使用的设备,不同端的设备返回给用户不同端的页面。说干就干,经过一个周末的主题筛选,与魔改(语言翻译,添加谷歌广告单元)等等。
新的问题
hugopublic
config.tomlconfig.tomlhugo
hugoHugogolanggo
2.包
2.1 os/exec
hugo
func checkHugo() error {
//验证hugo命令
hugpath, err := exec.LookPath("hugo")
if err != nil {
return err
}
fmt.Printf("hugo is available at %sn", hugpath)
fmt.Println()
return nil
}
hugo
func execHugo() error {
cmd := exec.Command("hugo")
cmd.Dir = "."
outinfo := bytes.Buffer{}
//command.Stdout is interfacse
cmd.Stdout = &outinfo
err := cmd.Start()
if err != nil {
return err
}
if err = cmd.Wait(); err != nil {
return err
}
fmt.Println(cmd.ProcessState.Pid())
fmt.Println(cmd.ProcessState.Sys().(syscall.WaitStatus).ExitCode)
fmt.Println(outinfo.String())
return nil
}
2.2 os
主要用于在生成之前,对上一次生成的文件进行删除
// 删除mobile
err = os.RemoveAll("mobile")
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
// 删除public
err = os.RemoveAll("public")
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
对生成的不同端的文件夹进行重命名以及配置文件重命名
// 重命名 config-hello.toml --config.toml
err = os.Rename("config-hello.toml", "config.toml")
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
// 执行命令
err = execHugo()
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
fmt.Println("mobile pages generated...")
// 重命名 还原 config.toml --config-hello.toml
err = os.Rename("config.toml", "config-hello.toml")
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
// 重命名 config-maupassant.toml --config.toml
err = os.Rename("config-maupassant.toml", "config.toml")
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
// 重命名
err = os.Rename("public", "mobile")
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
// 执行命令
err = execHugo()
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
fmt.Println("Web pages generated...")
// 重命名 还原 config.toml --config-maupassant.toml
err = os.Rename("config.toml", "config-maupassant.toml")
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
2.3 golang.org/x/crypto/ssh
ssh
func sshConnect() (sshClient *ssh.Client, err error) {
config := &ssh.ClientConfig{
User: "root",
Auth: []ssh.AuthMethod{
ssh.Password("admin123456!"),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
//ssh.FixedHostKey(hostKey),
}
sshClient, err = ssh.Dial("tcp", "47.98.184.99:22", config)
return
}
2.4 github.com/pkg/sftp
sshsftp
// ssh连接
sshClient, err := sshConnect()
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
defer sshClient.Close()
// sftp
client, err := sftp.NewClient(sshClient)
if err != nil {
fmt.Println(err.Error())
log.Fatal(err)
}
defer client.Close()
在远程服务器上创建文件夹与文件(上传)
func upload(client *sftp.Client, localRoot string, remoteRoot string) error {
error := filepath.Walk(localRoot, func(fp string, info os.FileInfo, err error) error {
if info == nil {
return nil
}
var temppath string
if info.IsDir() {
temppath = path.Join(remoteRoot, strings.ReplaceAll(fp, "\", "/"))
// test := info.Name()
// fmt.Println(test)
// hugo/public /usr/hugo/public
// /public /uer/public
err = client.MkdirAll(temppath)
if err != nil {
log.Fatal(err)
}
fmt.Printf(" %s copy file to remote server finished! path:%s n", fp, temppath)
return nil
}
srcFile, err := os.Open(fp)
if err != nil {
log.Fatal(err)
}
defer srcFile.Close()
temppath = path.Join(remoteRoot, strings.ReplaceAll(fp, "\", "/"))
dstFile, err := client.Create(temppath)
if err != nil {
log.Fatal(err)
}
defer dstFile.Close()
ff, err := ioutil.ReadAll(srcFile)
if err != nil {
log.Fatal(err)
}
dstFile.Write(ff)
fmt.Printf(" %s copy file to remote server finished! path:%s n", fp, temppath)
return nil
})
wg.Done()
return error
}
2.5 sync
goroutinesyncgoroutine
var wg sync.WaitGroup
func main() {
//ommit some code
wg.Add(2)
go upload(client, "mobile", "/usr")
go upload(client, "public", "/usr")
wg.Wait()
fmt.Println("Congratulations! uploaded successfully. ")
}
3.编写命令行工具
由于上面的代码是针对我个人的特殊情况,不具有一定的通用性,属于定制化工具。使用效果如下:
github.com/urfave/clihugop
hugop --lpath "hugo" --server "47.98.184.88:22" --username "root" --pwd "admin123456!" --rpath "/usr/wwwroot"
--lpathhugo--server--usernamessh--pwdssh--rpathpublic
3.1 源代码
欢迎下载使用:https://gitee.com/RandyField/hugo-publish
3.2 Releases