概述
本文描述了在 hugo 发表文章的SOP(Standard Operating Procedure,标准作业程序)。
基本概念
hugo 是 golang 开发的一个博客框架程序。常用的功能有三种:
- 新建一个博客文档:
hugo new XXX/XXX.md
- 启动本地博客服务器:
hugo server -D
- 编译博客网站:
hugo
基本上,在 windows 下维护基于 hugo 的博客,涉及到两个目录。可以分别称为「工作目录」和「公共目录」。
- 工作目录包含了图片、模板、原始博文(markdown文件)。
- 公共目录是一个完整的静态网站,包含所有要部署到服务器的静态文件(HTML、CSS、JS、图片等)。
习惯上,这两个目录各自保存为一个互相独立的 git 仓库。
基本流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
graph TD
Start((开始))
PullLatestWorkingDir[从远程仓库拉取最新工作目录]
UpdateWorkingDir[在工作目录里编辑]
PreviewWeb[预览网站效果]
RemoveDraftMark[移除博文草稿标记]
BuildStaticWeb[生成静态网站]
PublishToServer[部署到服务器]
BrowseWeb[浏览网站]
CommitPushWorkingDir[同步工作目录到远程仓库]
End((结束))
Start --> PullLatestWorkingDir
PullLatestWorkingDir --> UpdateWorkingDir
UpdateWorkingDir --> PreviewWeb
PreviewWeb --> UpdateWorkingDir
PreviewWeb --> RemoveDraftMark
RemoveDraftMark --> BuildStaticWeb
BuildStaticWeb --> PublishToServer
PublishToServer --> BrowseWeb
BrowseWeb --> UpdateWorkingDir
BrowseWeb --> CommitPushWorkingDir
CommitPushWorkingDir --> End
|
流程详解
Step 1: 从远处仓库拉取最新工作目录
由于博客编辑可能在多台工作机上进行,每次编辑前需要从远程拉取最新工作目录。
Step 2: 在工作目录里编辑
包括hugo new XXX/XXX.md
这类创建新博文的动作,编辑这个 XXX.md 博文,以及给这个博文打上标签。
博文的开头初始状态是这样的:
1
2
3
4
5
|
---
title: "XXX"
date: 2025-07-09T17:07:03+08:00
draft: true
---
|
这些并不是 markdown 的标准语法,而是一种叫做 Front Matter(前置元数据)的扩展语法,格式是YAML。
这里draft
的值默认是true
,表示这篇博文还处于草稿阶段。
这意味着直接hugo
或者hugo server
将看不到这篇博文。必须hugo server -D
才能看到。
给博文打标签的方法是在前置元数据里添加tags
内容。例如:
1
2
3
4
5
6
7
8
9
|
---
title: "XXX"
date: 2025-07-09T17:07:03+08:00
tags:
- job
- golang
- software
draft: true
---
|
Step 3: 预览网站效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
D:\seedjyh\seedjyh.com>hugo server -D
Watching for changes in D:\seedjyh\seedjyh.com\{archetypes,content,static,themes}
Watching for config changes in D:\seedjyh\seedjyh.com\config.toml
Start building sites …
hugo v0.128.1-0ff542b4b9cc7b5cb425bbab8bdb5aace81d0c03+extended windows/amd64 BuildDate=2024-07-02T06:46:41Z VendorInfo=gohugoio
| EN
-------------------+-----
Pages | 64
Paginator pages | 4
Non-page files | 0
Static files | 40
Processed images | 0
Aliases | 17
Cleaned | 0
Built in 111 ms
Environment: "development"
Serving pages from disk
Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
Web Server is available at http://localhost:1313/ (bind address 127.0.0.1)
Press Ctrl+C to stop
|
然后就可以用网页浏览器(如Chrome)打开本地博客服务器检查效果了。
Step 4: 移除博文草稿标记
这一步很简单,就是把之前markdown开头的draft
的值从true
改成false
。
Step 5: 生成静态网站
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
D:\seedjyh\seedjyh.com>hugo
Start building sites …
hugo v0.128.1-0ff542b4b9cc7b5cb425bbab8bdb5aace81d0c03+extended windows/amd64 BuildDate=2024-07-02T06:46:41Z VendorInfo=gohugoio
| EN
-------------------+-----
Pages | 55
Paginator pages | 3
Non-page files | 0
Static files | 40
Processed images | 0
Aliases | 15
Cleaned | 0
Total in 133 ms
|
不带任何参数的 hugo,会在当前目录下生成一个public
子目录。这个子目录并不属于「工作目录」,不要git add
到工作目录里。这个子目录public
就是「公共目录」,也叫「发布目录」,里面是一个完整的博客网站的静态文件集(HTML、CSS、JS、图片等)。
Step 6: 部署到服务器
将公共目录整个拷贝到自己的博客服务器上。
实践中,一般不会手动执行拷贝,而是在博客服务器上搭建一个git服务器,而公共目录自己也是个git仓库。当本地的公共目录被push
到博客服务器上的git服务器时,用一个git钩子执行
1
2
3
4
5
|
[root@VM-16-14-centos hooks]# pwd
/home/git/blog.git/hooks
[root@VM-16-14-centos hooks]# cat post-receive
#!/bin/sh
git --work-tree=/usr/local/www --git-dir=/home/git/blog.git checkout -f
|
意思是当这个git服务器收到推送时,就将整个git仓库的文件检出到/usr/local/www
目录。而后者目录就是博客的根目录,由nginx路由到那个目录。
具体创建钩子的操作,参见我的另一篇博客《用hexo创建博客》。
Step 7: 浏览网站
用网页浏览器(如Chrome)打开真正博客服务器上的博客页面。一般来说,博客内容不太多的话,推送公共目录后立刻就能生效。
Step 8: 同步工作目录到远程仓库
「工作目录」包含了博客的全部源文件,尤其是博客文章(markdown)、模板和图片。
为了防止文件丢失,这个目录的修改(如添加博文)需要被同步(commit&push
)到远端,就像第一步从远端拉取回来一样。