Manage personal blog in org-mode and host on Github using Hugo

This post is prepared completely in org-mode. YEAH!

从 2016 将博客迁移至 Hexo+Github 的方案后,我便一直采用此方案写博客。大体来说感受挺不错的,然而由于我有数百篇博客,build 速度永远很让我头大。尤其是有时 markdown 显示出问题了,我又得等上数分钟才能看到结果,体验很不好。所以一听说 Hugo 能一秒生成博客,哪怕要舍弃我花大功夫美化的 NeXT 主题,我依然心生向往,今天便将 Hexo 迁移至 Hugo,顺便达成了 Emacs 写博客的小目标。

安装 Hugo 并初始化

  • 首先使用 Homebrew 安装 Hugo:
$ brew install hugo
  • 然后建立站点
$ hugo new site blog
  • 安装主题,我采用比较简单的 even 主题
$ git clone https://github.com/olOwOlo/hugo-theme-even themes/even

从 Hexo 迁移

好消息是,此迁移过程相当无痛。由于我之前将博客内容存在 Dropbox 上,所以只需要将相关文件 link 至 Hugo 的相关文件夹内。结构大致如下:

.
├── content
│   ├── about
│   │   └── index.md
│   └── post
│       ├── post1.md
│       └── ...
├── static
│   ├── images
│   │   ├── image1.png
│   │   └── ...
│   └── CNAME
...

有一个需要注意的地方是 Hexo 与 Hugo 对于 markdown 头文件中的 url 定义不同,我采用 grep 将其批量改成 slug ,并在配置文件中添加了 permalinks 的生成方式,以保证超链接的稳定:

[permalinks]
  post = "/:year/:month/:slug"

生成预览

输入 hugo server ,几乎是眨眼工夫,便已在内存中生成预览,而且对于博文可即时显示改动,非常方便。确实比 Hexo 快上百倍。

                   | ZH-CN
+------------------+-------+
  Pages            |   956
  Paginator pages  |   139
  Non-page files   |     0
  Static files     |    85
  Processed images |     0
  Aliases          |   254
  Sitemaps         |     1
  Cleaned          |     0

Total in 820 ms

配合 org-mode 使用更佳

以前使用 Hexo 写博客时,博文都分散于各种 .md 文件中,管理起来很不方便。另一方面,由于我平时习惯用 org-mode 记记笔记,管理生活。有了好轮子,我干脆想着一鼓作气把车换了。在此我使用的是 ox-hugo 的 One post per Org subtree 方案,配置如下:

#+HUGO_BASE_DIR: ~/Dropbox/Blog/
#+HUGO_SECTION: post
#+HUGO_WEIGHT: auto
#+HUGO_AUTO_SET_LASTMOD: t
#+author:
#+hugo_custom_front_matter: :author "ziyunch"
* Technical                                                       :@技术宅:
** TODO 博客由 Hexo 迁移至 Hugo                           :Emacs:Hexo:Hugo:
   :PROPERTIES:
   :EXPORT_FILE_NAME: 20190826-hexo-2-hugo
   :END:

也就是说采用标签继承的方式,将博文分类。写完当篇博文,将 TODO 状态变更为 DONE 时, ox-hugo 会自动为文档生成时间戳。然后在 subtree 上 C-c C-e H H 即可在相应目录生成 .md 文档。此时如果后台正在运行着 hugo server ,即可在 http://localhost:1313/ 看到即时更新。

在 Github 上发布

第一次部署,需要新建一个 public 文件夹,并将原来部署了 Hexo 博客的 repo 关联上,步骤如下:

$ mkdir public
$ hugo -t even
$ cd public
$ git init
$ git remote add upstream https://github.com/ziyunch/ziyunch.github.io.git
$ git add .
$ git commit -m "switch to hugo"
$ git push -f upstream master

之后则可如官网发布指南所示编写一个可执行的 .sh 文件来自动化部署发布:

#!/bin/sh

# If a command fails then the deploy stops
set -e

printf "\033[0;32mDeploying updates to GitHub...\033[0m\n"

# Build the project.
hugo -t even

# Go To Public folder
cd public

# Add changes to git.
git add .

# Commit changes.
msg="rebuilding site $(date)"
if [ -n "$*" ]; then
        msg="$*"
fi
git commit -m "$msg"

# Push source and build repos.
git push upstream master

自此大功告成

Avatar
Runhan Yu
Data Engineer

My interests include big data, cloud computing, software development and biochemistry.

Related