迁移现有站点
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.* 命名空间。
ECharts 旧内容
旧 Pigsty 页面可能在 ECharts 块中包含 JavaScript。仅在经过审查的过渡期启用:
params:
content:
echarts_unsafe: true
新建与已经转换的图表都应使用 JSON 或 YAML。迁移完成后删除站点级开关;确实暂时无法转换时,也应把
unsafe=true 限制在具体短代码上。
字体
旧 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 unsafe 模式 | 2,473 |
这些是临时副本的构建结果,不代表四个生产站点已经完成迁移或部署。
生产迁移流程
对每个站点依次执行:
- 创建专用迁移分支;
- 固定 OINK 候选版本并记录其源码提交;
- 每次只删除一组内聚的覆盖项;
- 执行干净的 Hugo-only 构建与针对性自动化测试;
- 比较具有代表性的首页、文档页、博客页、特殊页面与
404页面; - 检查移动导航、两种颜色模式、语言切换、搜索、打印与站点保留的业务组件;
- 部署预览,并验证真实 URL 与网络请求;
- 评审通过后才合并并部署,随后执行生产冒烟测试。
对于 OINK 有意改变外壳的部分,应记录合理差异,而不是强求像素级相同。
回滚
保留迁移前的主题 pin、站点提交与已知可用部署产物。回滚时三者应一致恢复。针对新主题只重新引入一部分随机复制布局,会形成比任一完整版本都更难诊断的混合状态。