静态网站发布很简单,但简单并不免除发布检查的需要。有用的检查足够小,能在每次发布运行,也足够具体,能为真实的理由而失败。
构建干净的制品
使用固定版本的生成器,构建到一次性的输出目录:
set -eu
hugo version
hugo --cleanDestinationDir --gc --minify --destination public
--gc 回收未使用的构建缓存资源,不会清理陈旧的已发布页面。--cleanDestinationDir 会移除目标目录中的陈旧文件,因此只能用于一次性制品目录,不能指向源码或其他数据所在的目录。把打印出的版本与项目固定版本比较;打印版本本身不会强制版本一致。记录构建输入并验证生成的制品。干净的目标目录不能证明逐字节可复现:时间戳与其他非确定性输入需要单独控制和比较。不要在构建之后手改生成的 HTML。
检查制品,而不只是源码
检视生成的树,确认期望的入口点存在。把下面的断言块作为独立 shell 脚本运行;任何必需文件缺失或为空时,都应在打印清单之前停止:
set -eu
test -s public/index.html
test -s public/404.html
test -s public/robots.txt
test -s public/sitemap.xml
find public -type f -print | sort
然后搜索意外的占位符、本地路径与仅开发用的主机:
rg -l 'localhost|127\.0\.0\.1|TODO|example\.com|/Users/' public --glob '*.html'
这只是复核线索,不是自动发布门禁:本清单这类示例本来就会命中,翻译页中也一样。这项仅检查 HTML 的扫描不会覆盖 XML 订阅或 JSON 搜索输出。rg 无匹配时退出 1,发生错误时退出 2。逐个复核列出的文件,区分围栏示例与有效链接或属性,并用基于解析器的链接检查作为真正门禁。公开链接中的私有路径属于发布错误。
验证公共路由
让隔离的类生产服务器直接指向这份制品,才能进行更可靠的发布前路由检查。Hugo 开发服务器会重新构建内容;下面是独立的源码预览,不能证明它服务的就是已经检查过的 public/ 字节。第一条命令在一个终端运行,其余请求在另一个终端运行:
hugo server --bind 127.0.0.1 --port 1313 --baseURL http://127.0.0.1:1313/ \
--disableFastRender --disableLiveReload --renderToMemory
curl -I http://127.0.0.1:1313/
curl -I http://127.0.0.1:1313/notes/
curl -I http://127.0.0.1:1313/resources/
curl -I http://127.0.0.1:1313/missing-page/
HEAD 检查不比较正文。对待发布服务器再运行 GET,发布后将公共正文与制品比较,并检查两种语言。确认缺失路由在生产服务器上返回 404 状态。一个外观精美但状态 200 的错误页,仍然会破坏监控与缓存。
记录结果
在发布记录中保留源码提交、生成器版本与每个可下载资源的校验和。这样无需依赖记忆,就能把线上文件与产生它的源码进行比较。
这份检查清单的可下载版本在资源一节中。
来源
- Hugo command reference,干净生产构建的生成器标志,已核验 2026-07-30。
- curl manual,HTTP 验证与响应头检查选项,已核验 2026-07-30。
- 静态网站发布检查清单,可下载的配套资源。
- Hugo server command reference,开发服务器重新构建、内存渲染与实时刷新控制,已核验 2026-10-15。