由于 Hexo 较难在主题之外的地方自定义功能,而且构建速度较慢,因此将博客迁移至 Hugo。
迁移
迁移的时候,除了参考官方文档之外,也参考了一些 Hugo 主题文档:
入门以「DoIt 主题文档」为主,了解 Hugo 的基础使用和功能特性,同时参考其他两个主题文档,将基于 Hexo 的博客内容迁移至 Hugo。
在完成内容迁移之后,可以阅读 Hugo 与 Hexo 的异同 这篇文章,深入了解其异同,详细阅读并依此进行博客修改后,就可以进入 Hugo 的世界了。
以下补充一些博主迁移时遇到的问题及解决方案:
GitInfo
使用 Git 时间作为文章的修改时间(lastmod
)时,注意设置 enableGitInfo
,而且仓库需完整,CI/CD 时尤其要注意这一点,例如 Cloudflare Pages 默认克隆最近一次提交,需要在构建命令前添加 git fetch --unshallow
命令,来补完仓库内容。
Taxonomies
对于分类 Taxonomies
,如果项(Term
)包含“特殊”字符则读取 Git 时可能出现路径不匹配的情况,需要设置 git config --global core.quotepath false
。
建议“项”不要包含特殊标点,例如 .#
等,目前 Hugo 对特殊标点的处理还不完善,还有注意有些标点会进行转义,例如
(空格)转为 -
等,因此最好使用简短无特殊字符的内容作为项,而将名称写入 title
,下面举例说明:
对于 .Net Core 3.1
tag,在文章的 Front Matter
中使用 tag: [netcore31]
;之后定义其元数据,元数据定义于 /content/<TAXONOMY>/<TERM>/_index.md
,此例的位置就是 /content/tags/netcore31/_index.md
,内容如下
YAML
---
title: .Net Core 3.1
slug: dotnet-core-3.1
---
配合配置文件中的 permalinks.tags: /tags/:slug/
就可实现,标签显示为 .Net Core 3.1
,且其链接为 tags/dotnet-core-3.1
的效果。
深入
对于博客的内容和样式深度的自定义就需要阅读官方文档了。
附录
之前写过一篇文章关于 GitHub Actions 自动部署的,迁移至 Hugo 后修改记录在此。
GitHub Actions
YAML
name: Deploy Blog Pages
on:
push:
branches:
- main
paths-ignore:
- .gitignore
- .github/**
- .vscode/**
- archetypes/**
jobs:
build-and-deploy-hugo:
runs-on: ubuntu-latest
timeout-minutes: 5
defaults:
run:
shell: pwsh
steps:
# 部署到 Cloudflare Pages
- name: Deploy to Cloudflare Pages
run: |
Invoke-WebRequest -Uri '${{ secrets.CF_HOOK }}' -Method Post
continue-on-error: true
- name: Checkout
uses: actions/checkout@v3
with:
submodules: true
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: "latest"
extended: true
- name: Disable git.core.quotePath
run: git config --global core.quotepath false
- name: Build
run: hugo
# 部署到 GitHub Pages
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.PAT }}
external_repository: KiyanYang/KiyanYang.github.io
publish_branch: main
publish_dir: ./public
Cloudflare Pages
设置构建命令为 git fetch --unshallow && git config --global core.quotepath false && hugo --environment=cloudflare-pages
,因为 Hugo 依赖于 baseURL,因此增加 cloudflare-pages
配置,参考文档 Configure Hugo,我的配置目录结构如下:
├── config
│ ├── _default
│ │ ├── config.yaml
│ │ ├── languages.yaml
│ │ └── params.yaml
│ └── cloudflare-pages
│ ├── config.yaml
│ └── params.yaml