从hexo迁移到hugo

原因

间接原因

  1. hexo基于nodejs,部署hexo的时候需要加载许多包。而hugo只需要一个二进制文件,相对来说部署更加简便。
  2. hugo的文件分布更简洁一些,可以通过自己写的部署脚本将博客源md文件也上传至同一仓库下的另一分支(hexo也可以实现,但我没尝试-_-||

直接原因

前几天在使用scoop升级了nodejs之后,hexo d命令报错TypeError [ERR_INVALID_ARG_TYPE]: The "mode" argument must be integer,无法将本地修改推到github,就打算迁移至hugo试一试。

过程中的踩坑

content文件夹

hugo的博客md文件都是放在根目录的content文件夹下(hexo的是在source/_posts文件夹下),在使用命令hugo new时应指定所属文件夹,例如

1
$ hugo new "posts/新文章.md"

如果不指定前面的posts文件夹,则直接创建在content文件夹下。

同时,如果直接在content文件夹下创建诸如me.mdfriendlinks.md文件,同时在config.toml配置文件中指定这些文件对应的url链接,则可实现类似hexo中类似的about.html友链等页面的效果。

disablePathToLower

hugo在使用时,url会默认将所有英文字母转为小写,这将导致这样的问题:若md文件的名称中有大写字母时,通过链接访问会自己转为小写,提示找不到页面,因此应该在config.toml中将下面的选项打开

1
disablePathToLower = true

FrontMatter

例子

1
2
3
4
title: test
date: 2020-01-01T12:13:14+08:00
tags: ["hugo"]
categories: ["技术"]

date

格式与hexo不同

tags

类似于Go中的切片,应该使用中括号[],hexo中使用-hugo中若不写中括号,则在生成静态文件时会产生at <.>: *range* can't iterate over之类的报错。

categories

同样类似于Go中的切片,应该使用中括号[],hexo中使用-,且hexo中为单数:category,与tags的复数形式并不一致。若不写中括号,同样会出现tags的类似问题。

hugo的文件结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
➜  myblog-hugo tree -L 1
.
├── README.md
├── config.toml
├── content
├── deploy_git
├── myDeploy.ps1
├── myDeploy.sh
├── public
├── resources
└── themes

README.md

文件

我自己创建的

config.toml

文件

hugo的配置文件,拷贝自所使用主题提供的例子,需要自己根据需要修改

content

文件夹

存放博客源文件

deploy_git

文件夹

我自己创建的,用于向github推送的临时文件夹

myDeploy.ps1

文件

推送至GithubPowerShell脚本

myDeploy.sh

文件

推送至GithubBash脚本

public

文件夹

存放hugo生成的静态文件

resources

文件夹

hugo缓存

themes

文件夹

存放主题

推送至Github

public文件夹里的内容为Github Pages对外显示的内容,因此推送至master分支。其他一些需要备份的内容,推送至source分支。

PowerShell脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
hugo

cd deploy_git

# update to master branch
git checkout master

# delete all files except .git
$files = Get-ChildItem -Path .\ -Exclude .git
if ($files.count -gt 0) {
    foreach($file in $files)
    {
        Remove-Item $file.FullName -Recurse -Force
    }
}

# copy pages files
Copy-Item -Path ..\public\* -Recurse -Destination .\

# Tuesday 06/25/2019 16:17 -07:00
# "dddd MM/dd/yyyy HH:mm K"
$currentTime = Get-Date -Format "yyyy-MM-ddTHH:mm:ss+08:00"
git add -A
git commit -m $currentTime
git push origin master

# update to source branch
git checkout source

# delete all files except .git
$files = Get-ChildItem -Path .\ -Exclude .git
if ($files.count -gt 0) {
    foreach($file in $files)
    {
        Remove-Item $file.FullName -Recurse -Force
    }
}

# copy some files
Copy-Item -Path ..\content -Recurse -Destination .\
Copy-Item -Path ..\README.md -Recurse -Destination .\
Copy-Item -Path ..\.gitmodules -Recurse -Destination .\
Copy-Item -Path ..\config.toml -Recurse -Destination .\
Copy-Item -Path ..\myDeploy.ps1 -Recurse -Destination .\
Copy-Item -Path ..\myDeploy.sh -Recurse -Destination .\
Copy-Item -Path ..\themes -Recurse -Destination .\

git add -A
git commit -m $currentTime
git push origin source

# return to the previous path
cd ..

Bash脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cd "deploy_git"

git checkout master

rm -rf `ls | grep -v ".git"`
rm ".gitmodules"

cp -r ../public/* ./

git add -A
git commit -m `date +%Y-%m-%dT%H:%M:%S\+08:00`
git push origin master

git checkout "source"
rm -rf `ls | grep -v ".git"`

cp -r ../content ./
cp ../README.md ./
cp ../.gitmodules ./
cp ../config.toml ./
cp ../myDeploy.ps1 ./
cp ../myDeploy.sh ./
cp -r ../themes ./

git add -A
git commit -m `date +%Y-%m-%dT%H:%M:%S\+08:00`
git push origin "source"

写在最后

现在还是刚开始使用hugo,后续如果有其他问题和发现,也会一并更新到这里。

updatedupdated2020-05-282020-05-28