这是本节的多页打印视图。 .
升级迁移
本节介绍 OINK 的更新合同。目标版本 指站点准备升级到的版本。开始之前,请先阅读对应的发布注记,其中会记录破坏性变更、必要操作和已经验证的 Hugo 版本范围。
OINK 消费端构建不安装 Node.js 软件包。npm 仍可供主题维护者使用,但不是站点更新步骤。
更新前的准备
- 在 Git 分支或其他可恢复的站点副本上操作。
- 记录当前固定的主题修订版本与 Hugo Extended 版本。
- 先完整构建一次当前生产站点,以便区分新增故障与原有问题。
- 阅读当前版本到目标版本之间的每一篇发布注记,不要跳过中间版本的迁移操作。
更新顺序
请按以下顺序更新:
更新 Hugo
安装目标版本支持的 Hugo Extended,并同步更新本地开发环境、CI、Cloudflare Pages、Netlify、容器镜像和相关缓存键。构建前先核对实际选中的二进制文件:
hugo version当前验证基线是 Hugo Extended 0.164.0,主题当前声明的最低版本是
0.160.1。如果发布注记调整了其中任一数值,应以发布注记为准。
更新主题
根据站点的安装方式选择对应页面:
如果使用发布归档,请先保留站点自己的覆盖,再用目标版本归档替换现有主题目录。务必校验归档的 checksum,并让
LICENSE、NOTICE 与 VENDOR.json 始终随发行物保留。
审查主题覆盖
如果站点覆盖了主题文件,请逐一与新版本主题中的对应文件比较,并移植仍然适用的变更。重点检查以下目录:
assets/i18n/layouts/static/
当主题已经提供相同行为时,应删除对应覆盖。带业务语义的站点组件、产品页面和品牌素材则应继续留在站点层。
检查站点
既要运行开发预览,也要执行与生产环境完全相同的命令。Hugo-only 合同下的生产构建命令是:
hugo --gc --minify至少验证以下项目:
- 构建完成,且没有错误、警告或弃用提示。
- 中英文首页、文档页、普通博客页与发布注记页均能正常渲染。
- 导航、面包屑、目录、稳定标题链接和语言切换均指向正确位置。
- 本地搜索能返回中英文结果。
- 深浅色模式、移动端导航与打印输出仍然可用。
- 页面只加载实际使用的本地运行时;默认页面不发起由主题产生的第三方子资源请求。
- Mermaid、KaTeX、Markmap、Swagger UI、Redoc 以及实际使用的内容组件仍能渲染。
- 站点自有短代码和业务页面保持完整。
最后,执行目标版本发布注记列出的所有版本专属检查。
1 - 升级 Oink Hugo Module
固定版本
生产站点应导入发布标签或不可变的 commit,绝不能跟随未固定版本的分支。在站点根目录,把 Oink 更新到指定 ref:
hugo mod get github.com/pgsty/oink@THEME_REF
hugo mod tidy将 THEME_REF 替换为该版本发布说明指定的根标签或 commit。
测试本地 checkout
如果要在不修改已提交模块版本的前提下测试本地 OINK checkout,请使用被忽略的 Go workspace:
go work init .
go work edit -replace=github.com/pgsty/oink=/absolute/path/to/oink
export HUGO_MODULE_WORKSPACE=go.work
hugo --gc --minify不要把包含开发者机器专属绝对路径的 go.work 提交到仓库。
验证解析出的模块
检查 Hugo 的依赖图:
hugo mod graph确认主题解析到预期的标签、commit 或本地 replacement。OINK 不需要运行
hugo mod npm pack 或 npm install,因为浏览器依赖已经随主题提供。
随后继续审查主题覆盖。
2 - 升级 Oink Git submodule 或克隆
请根据安装方式选择相应步骤:submodule 或克隆。两种方式都必须固定到目标版本标签或不可变的 commit。
更新 submodule
在站点根目录进入主题仓库获取标签,并 checkout 目标 ref:
git -C themes/oink fetch --tags
git -C themes/oink checkout THEME_REF
git add themes/oink
git commit -m "Update OINK theme to THEME_REF"如果站点使用其他目录名,请相应替换 themes/oink。父仓库会记录最终的 submodule
commit。请推送这次父仓库提交,确保 CI 和其他贡献者解析到完全相同的源码。
无需安装任何 npm 软件包。如果某个发行版的完整主题包含仅供源码使用的嵌套 submodule,请按照该版本的说明初始化;OINK 发行物所需的浏览器运行时资源已经包含在内。
更新克隆
如果主题目录是由站点跟踪或恢复的克隆,请将其更新到目标 ref:
git -C themes/oink fetch --tags
git -C themes/oink checkout THEME_REF沿用站点现有的可复现方式,提交、归档或记录更新后的主题。不要让生产构建持续跟随
main。
如果克隆中包含本地修改,请在切换 ref 前把它们提交到分支。更新后再通过 rebase 或其他方式重新应用,并显式解决冲突。可复用的修改应尽量回馈 OINK;消费站点只保留真正属于站点的覆盖。
随后继续审查主题覆盖。
3 - 从 Docsy npm 包迁移
上游 @docsy/theme npm 包不是 OINK 的发行渠道。OINK 将 Bootstrap、Font
Awesome、字体和浏览器运行时直接随主题提供,因此消费站点只需 Hugo
Extended 即可构建。
移除 npm 主题集成
首先选择一种 OINK 发行方式:固定版本的归档、Git
submodule 或克隆,或者兼容 Hugo 模块。让 Hugo 能够访问该主题,并确认执行
hugo --gc --minify 时可以正确解析。
随后,从站点的 package.json 中移除
@docsy/theme,以及仅用于构建 Docsy 资源的依赖。删除 Hugo 配置中 Bootstrap 和 Font
Awesome 的 npm 挂载项,同时删除只为旧主题管线存在的 PostCSS 与 Autoprefixer 构建步骤。
不要仅仅因为某项应用依赖使用 npm 就将其删除。Hugo-only 合同针对文档主题;站点自有应用或业务组件仍可能采用另一套明确且必要的工具链。
验证迁移
从全新 checkout 开始,只安装 Hugo Extended,不创建 node_modules
目录,然后执行:
hugo --gc --minify如果站点同时支持 LTR 和 RTL 页面,请分别检查。还要验证本地字体与图标、搜索、图表、API 文档和所有已经迁移的内容组件。构建完全正常后,只有在站点自有工具也不再使用 lockfile 时,才可以删除过时的 lockfile。
随后继续审查主题覆盖。
4 - 迁移现有 Docsy 站点
OINK 旨在替换各站点复制的公共外壳、运行时与短代码,而无需批量重写普通正文。安全迁移应按依赖关系删除覆盖项,把产品专用行为留在站点,并在修改生产环境前先验证临时副本。
迁移原则
- 固定目标实现,不要把生产站点迁移到未固定版本的分支。
- 删除覆盖项之前先完成清点。
- 删除公共主题副本,不删除站点业务逻辑。
- 在 OINK API 兼容的地方,保持内容 URL、front matter 与短代码行为不变。
- unsafe 或在线例外必须显式声明,并且只在过渡期使用。
- 分别测试构建产物、浏览器行为与托管站点行为。
固定目标版本
请在 go.mod 中固定已发布标签,或使用完整的版本化归档。预发布评估期间,Hugo
Module 站点可以使用被忽略的 Go
workspace,在不修改已提交模块版本的情况下解析本地 checkout:
go work init .
go work edit -replace=github.com/pgsty/oink=/absolute/path/to/oink
export HUGO_MODULE_WORKSPACE=go.work
hugo --gc --minify站点的 hugo.yaml 导入 github.com/pgsty/oink;workspace 只替换本地 checkout。
清点现有覆盖项
把每个站点级文件归入以下四类之一:
| 类别 | 处理方式 |
|---|---|
| 公共外壳的完全或近似副本 | OINK 验证通过后删除 |
| OINK 已提供的可复用组件 | 删除或机械重命名 |
| 范围明确的品牌或产品定制 | 保留,再缩小到最小 hook |
| 业务专用数据或交互 | 留在站点 |
layouts/、assets/、static/、配置与构建工作流必须一起检查。复制的短代码通常还伴随一份 JavaScript
bundle、样式表、vendor 文件和 CI 安装步骤。
迁移配置
搜索与品牌
启用主题提供的本地搜索,并让外壳使用站点自己的 Logo:
params:
logo: img/product.svg
offlineSearch: true继续在原有语义位置使用
title、languages.*、github_repo、github_project_repo、
github_branch、page_width 与 ui.*,不要把它们迁入 oink.* 命名空间。
字体
旧 Sass 开关 $td-enable-google-fonts: true 现在会选择 OINK 随附的本地 Open
Sans,而不会请求 Google Fonts。$td-web-font-path
不再参与当前构建。需要其他字体的站点必须提供获准使用的本地资源及其许可证。
删除公共覆盖项
临时构建证明等价后,可以删除站点中的以下副本:
layouts/baseof.html与公共 docs/blogbaseof*.html;- 公共 navbar、footer、sidebar、目录(TOC)、search、head CSS partial 及相应 hook;
- 旧的公共品牌文档外壳 partial;
asciinema、echarts、infographic、doc-carousel、details、tab/tabpane、card 与param短代码副本;- 只服务于上述已删除实现的 JavaScript、Lunr 副本、轮播代码与 SCSS;
- 不再被任何站点资源需要的消费端 PostCSS 与 Autoprefixer 步骤。
应按引用关系删除,而不是直接清空
layouts/。首页、下载页与门户仍可能调用本地 icon、search dialog、blog
row 或 tag filter 等 partial。
保留站点专用行为
保留语义属于具体产品的内容与代码:
- 产品矩阵与兼容性数据;
- 价格、下载、门户、解决方案与目录页面;
- 站点专用首页结构;
- 自定义重定向、响应头、分析或身份集成;
- 承载业务数据、而非通用呈现逻辑的内容组件。
对于 Pigsty 家族,pgvers、pgext_matrix、pgext_os_matrix、home-docs
以及当前 metric 实现继续留在站点层。
参考站点矩阵
当前迁移计划采用以下边界:
| 站点 | 删除或迁移 | 保留 |
|---|---|---|
| SILO | 公共 docs/blog 外壳、核心短代码与重复运行时;设置 logo: img/silo.svg |
首页、下载页与产品数据 |
| PGSTY | 公共外壳与核心短代码;设置 logo: img/logo/logo.svg |
门户、解决方案与企业页面 |
| SOW | 公共 docs/blog 外壳、核心短代码与重复运行时;设置 logo: img/sow.svg |
首页与仓库专用内容 |
| Pigsty | 公共外壳、核心短代码与重复运行时;设置 logo: icons/logo.svg,并保留已审查的 ECharts 回调 |
扩展矩阵、首页与价格页、目录样式 |
该矩阵是清点工作的起点,并不意味着可以删除所有名称相似的文件。必须在目标检出目录中解析实际模板引用。
演练工作流
请在消费站点的临时副本中演练迁移。应用本地 Oink workspace,每次删除一组计划覆盖项,阻断非预期网络与前端工具访问,再执行生产构建:
HUGO_MODULE_WORKSPACE=go.work hugo --gc --minify演练不得修改源工作区。保留失败副本用于诊断,并记录准确的主题 commit、Hugo 版本、已删除文件与输出数量。
当前证据
最近一次记录的演练发生在 2026-08-08,使用 Hugo Extended 0.164.0:
| 站点 | 演练结果 | HTML 文件数 |
|---|---|---|
| SILO | 删除 20 个公共覆盖项;完整构建中英文内容,OINK 外壳、同源搜索与站点 Logo 生效 | 1,095 |
| PGSTY | 删除 20 个公共覆盖项;构建双语门户,并用临时 docs 页面验证外壳 | 16 |
| SOW | 删除 20 个公共覆盖项;完整构建中英文内容,OINK 外壳、同源搜索与站点 Logo 生效 | 128 |
| Pigsty | 删除 24 个公共覆盖项;保留三个业务矩阵短代码与现有 ECharts 回调 | 2,473 |
这些是临时副本的构建结果,不代表四个生产站点已经完成迁移或部署。
生产迁移流程
对每个站点依次执行:
- 创建专用迁移分支;
- 固定 OINK 候选版本并记录其源码提交;
- 每次只删除一组内聚的覆盖项;
- 执行干净的 Hugo-only 构建与针对性自动化测试;
- 比较具有代表性的首页、文档页、博客页、特殊页面与
404页面; - 检查移动导航、两种颜色模式、语言切换、搜索、打印与站点保留的业务组件;
- 部署预览,并验证真实 URL 与网络请求;
- 评审通过后才合并并部署,随后执行生产冒烟测试。
对于 OINK 有意改变外壳的部分,应记录合理差异,而不是强求像素级相同。
回滚
保留迁移前的主题 pin、站点提交与已知可用部署产物。回滚时三者应一致恢复。针对新主题只重新引入一部分随机复制布局,会形成比任一完整版本都更难诊断的混合状态。