由于 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