
图:Hugo 项目官方首页 gohugo.io。
Hugo v0.168.0 于 2026 年 10 月 13 日发布。即使你从没写过一行 Go,这个版本也值得留意:它因升级到 Go 1.27.2 带进了 15 个安全修复,其中 3 个 CVE 正好影响 HTML/JS 模板转义——而这正是每个 Hugo 站点都会跑的代码路径;同时它还加了一批图像处理和多语言构建的改进,让静态站点的维护明显省事。
下面这篇指南带你在 Linux 上装好这个版本、构建一个真实项目,并说清楚到底改了什么。
为什么这个版本值得关注
Hugo 是一个用 Go 写的静态站点生成器。它把 Markdown 和模板编译成一份纯 HTML、CSS、JavaScript 目录,任何 Web 服务器都能直接托管。没有运行时,没有数据库,凌晨三点不需要给后台打补丁。
v0.168.0 对重视安全的运维人员尤其重要。Hugo 现在基于 Go 1.27.2 构建,带进了 Go 安全公告里的 15 个修复,其中三个直接相关:
- CVE-2026-94448 —— JavaScript 模板字符串里连续表达式没有重置上下文跟踪,可能导致内联 JavaScript 转义不正确。
- CVE-2026-97030 ——
yield没被识别为 regexp 的 preceder 关键字,同样影响转义正确性。 - CVE-2026-56857 —— Windows 上
os.Root.MkdirAll可能跟随目录联接跳出根目录。
此外,Hugo 把 github.com/tdewolff/minify 升到 v2.24.19,解决了 GHSA-3ppm-p7r9-c5w3:压缩 HTML 中的内联 JS 时,</script> 和 <!-- 没被正确转义。如果你跑 hugo --minify(你应该跑),这个修复很关键。
还有一个行为变化值得单独提:Hugo 现在会忽略 theme 里定义的 module.replacements,只有项目自身可以定义。如果你的站点依赖某个主题来重映射模块,必须把这部分配置挪到项目里,否则构建会悄悄解析到另一个依赖版本。
在 Linux 上安装 Hugo 0.168.0
Hugo 有四个版本(edition),选对能省掉一个下午的困惑。
| 特性 | standard | deploy | extended | extended/deploy |
|---|---|---|---|---|
| 核心功能 | ✅ | ✅ | ✅ | ✅ |
| 直连云端部署 | ❌ | ✅ | ❌ | ✅ |
| LibSass 支持 | ❌ | ❌ | ✅ | ✅ |
除非有明确理由,否则选 extended。它内嵌 LibSass,而且发布说明确认内嵌 LibSass 已在 v0.153.0 被弃用,未来会移除。Hugo 现在引导你用 Dart Sass 转译器,而 Dart Sass 在所有 edition 上都兼容。想提前摆脱移除计划,extended + Dart Sass 就是最稳的组合。
deploy 版本比多数人预期的要新。大约从 v0.159.2 开始加入,它让 hugo deploy 能把构建结果直接推到 Google Cloud Storage 存储桶、AWS S3 存储桶或 Azure Storage 容器——不需要 rsync,也不需要 CI 胶水代码。
方式一:预编译二进制(推荐)
最干净的路径,而且能拿到精确版本,extended 版也在内。
cd /tmp
curl -LO https://github.com/gohugoio/hugo/releases/download/v0.168.0/hugo_extended_0.168.0_linux-amd64.tar.gz
tar xzf hugo_extended_0.168.0_linux-amd64.tar.gz hugo
sudo install -m 0755 hugo /usr/local/bin/hugo
hugo version输出应该长这样:
hugo v0.168.0-e27a6760c5547237f87d353aebe0580feadb20f4+extended linux/amd64 BuildDate=2026-10-13T16:42:50Z VendorInfo=gohugoioARM 硬件把 linux-amd64 换成 linux-arm64。
方式二:发行版包管理器
快,但通常不是最新版。官方文档明确提醒:仓库里的版本”取决于发行版和发布版本,在某些情况下不会是最新版”。
# Debian / Ubuntu 及其衍生版
sudo apt install hugo
# Fedora / RHEL / CentOS
sudo dnf install hugo
# Arch 及其衍生版
sudo pacman -S hugo
# Alpine(community 仓库)
doas apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community hugo方式三:Snap
sudo snap install hugoSnap 是严格隔离的,这带来一个实际限制:站点必须放在家目录里或可移动介质上。确实需要时用 sudo snap connect hugo:removable-media 放开,用 sudo snap refresh --hold hugo 控制自动更新。
构建你的第一个站点
Hugo 的项目脚手架最近变了——hugo new site 现在是 hugo new project,并且创建时就能选定配置格式。
hugo new project quickstart
cd quickstart
git init
git submodule add https://github.com/gohugo-ananke/ananke themes/ananke
echo "theme = 'ananke'" >> hugo.toml
hugo serverhugo new project 的 --format 参数接受 toml、yaml 或 json,默认 TOML。用完按 Ctrl+C 退出开发服务器。
添加内容用 hugo new content,它会从路径推断内容类型:
hugo new content content/posts/my-first-post.md生成的文件带 front matter,其中 draft = true,写作阶段正是你想要的。Hugo 的渲染引擎符合 Markdown 的 CommonMark 规范。想在本机看到草稿,给服务器加开关:
hugo server --buildDrafts
hugo server -D
图:extended 版 v0.168.0 在 Linux 上的真实 hugo --logLevel info 输出,逐字从终端截取。
这张截图是真实输出。一个小站点构建耗时 18 毫秒,内部构建时长不到 4 毫秒。这就是为什么 Hugo 至今仍是”我的文档站不需要 Node 构建链”这个问题的默认答案——性能宣传不是营销词,日志里就能看到。

图:Hugo 0.168.0 生成的站点。日期和阅读时长都直接来自 front matter。
0.168.0 到底改了什么
图像处理:firstFrameOnly 与 FrameCount
头号特性是新增的 imaging.firstFrameOnly 选项,以及配套的处理开关,让 Hugo 只解码并编码动图的第一帧。当目标格式不支持动画时,Hugo 现在也只解码第一帧;如果处理所有帧会超出 WASM 内存上限,它会提前失败并给出明确错误。
如果你遇到过站点里大型 GIF 或 APNG 导致的”内存超限”,这就是解药。新增的 FrameCount 方法可以先判断图像是否为动画:
{{ with resources.Get "media/hero.gif" }}
{{ if gt .FrameCount 1 }}
{{ $static := .Resize "1200x webp" }}
{{ end }}
{{ end }}多语言构建有了正式 API
site.Language 现在带 Translate 和 Format* 方法。你可以遍历 site.Languages,用一个模板翻译到每种语言,不用再为每种语言维护一份手写字典。这砍掉了一整类重复模板代码。
其他小改进
js.Build 和 css.Build 现在接受 charset 选项,给非 UTF-8 受众打包资源时用得上。Hugo 还支持终端的 OSC 7501 程序状态(working / done / idle / error),与已有的 OSC 9;4 进度报告并存——支持它的终端上,长构建会显示真实状态而不是转圈动画。
模板层:该去哪里看
Hugo 的威力在模板系统,而理解它最好的办法是直接读一个真实的模板。下面就是驱动 Hugo 文档站的那个主题的 index.html:

图:gohugioTheme 的首页模板。Hugo 的 define 块和 partial 调用把页面拼装成一堆小而可复用的片段。
这个模式值得记住:define "header" 和 define "main" 是模板块,partial 调用引入可复用片段,每个 partial 通过 . 拿到当前上下文。模板里的 CSS 工具类(w-100、ph4、bg-white、bb bt b--light-gray)来自 Tachyons——Hugo 自己站点用的一个微型工具类框架。

图:Hugo 的内容层级。content/ 里的文件路径直接决定输出路径,不需要任何配置。
最后这张图正是新手最容易卡住的地方。Hugo 的核心思路是:内容路径本身就是 URL。content/posts/my-first-post.md 会变成 /posts/my-first-post/,常见场景下不存在需要维护的路由表。
部署到云存储
装的是 deploy 版本的话,hugo deploy 会处理上传。在项目配置里配好 target 之后:
hugo deploy --target production常用参数:--dryRun(只显示会发生什么)、--confirm(改动前询问)、--force(上传全部文件)、--invalidateCDN(让目标 CDN 缓存失效,默认开)、--maxDeletes(限制删除数)、--workers(并行传输数,默认 10)。
hugo deploy 同样继承了前面提到的安全修复:Go 1.27.2 里针对 HTTP/2 服务崩溃、内存耗尽、连接不同步和 Range 头无界解析的 net/http 修复,对 hugo server 和远程资源抓取都直接相关。
模块与其余工具链
模块系统用 Go modules 管理依赖,hugo mod 覆盖完整生命周期:hugo mod init 初始化、hugo mod get 添加依赖、hugo mod tidy 清理、hugo mod graph 查依赖图、hugo mod vendor 本地 vendor。另有 hugo mod npm 对接 Node 包、hugo config 输出解析后的配置、hugo list drafts 找出未发布内容、hugo import jekyll 迁移老 Jekyll 站点。
两个值得背下来的命令:
hugo --gc --minify --cleanDestinationDir # 生产构建
hugo server -D --navigateToChanged # 开发--gc 清理过期缓存,--minify 压缩输出,--cleanDestinationDir 清掉目标目录里的残留文件,这样重命名页面后不会留下幽灵文件。
小结
Hugo v0.168.0 是一个”安全性”和”功能”同等重要的版本。升级 Go 1.27.2 带来 15 个漏洞修复,其中 3 个影响模板转义,1 个影响 --minify 用的 JS 压缩器。如果你用不可信内容构建 Hugo 站点——用户提交的 Markdown、导入的压缩包、第三方主题——那升级是一项安全任务,不是例行公事。
功能方面,firstFrameOnly 和 FrameCount 解决了动图带来的实际内存问题,site.Language 的翻译辅助简化了多语言模板,OSC 7501 终端状态报告则是长构建时能明显感觉到的小改善。
安装只需要一条 curl 加一次 tar。回报是一个毫秒级构建、运行时除了 Web 服务器什么都不需要的站点。
完整文档见 gohugo.io,v0.168.0 发布说明在 GitHub Releases 页面。
评论