迁移现有站点

用 OINK 替换复制的 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

继续在原有语义位置使用 titlelanguages.*github_repogithub_project_repogithub_branchpage_widthui.*,不要把它们迁入 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/blog baseof*.html
  • 公共 navbar、footer、sidebar、目录(TOC)、search、head CSS partial 及相应 hook;
  • 旧的公共品牌文档外壳 partial;
  • asciinemaechartsinfographicdoc-carouseldetailstab/tabpane、card 与 param 短代码副本;
  • 只服务于上述已删除实现的 JavaScript、Lunr 副本、轮播代码与 SCSS;
  • 不再被任何站点资源需要的消费端 PostCSS 与 Autoprefixer 步骤。

应按引用关系删除,而不是直接清空 layouts/。首页、下载页与门户仍可能调用本地 icon、search dialog、blog row 或 tag filter 等 partial。

保留站点专用行为

保留语义属于具体产品的内容与代码:

  • 产品矩阵与兼容性数据;
  • 价格、下载、门户、解决方案与目录页面;
  • 站点专用首页结构;
  • 自定义重定向、响应头、分析或身份集成;
  • 承载业务数据、而非通用呈现逻辑的内容组件。

对于 Pigsty 家族,pgverspgext_matrixpgext_os_matrixhome-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

这些是临时副本的构建结果,不代表四个生产站点已经完成迁移或部署。

生产迁移流程

对每个站点依次执行:

  1. 创建专用迁移分支;
  2. 固定 OINK 候选版本并记录其源码提交;
  3. 每次只删除一组内聚的覆盖项;
  4. 执行干净的 Hugo-only 构建与针对性自动化测试;
  5. 比较具有代表性的首页、文档页、博客页、特殊页面与 404 页面;
  6. 检查移动导航、两种颜色模式、语言切换、搜索、打印与站点保留的业务组件;
  7. 部署预览,并验证真实 URL 与网络请求;
  8. 评审通过后才合并并部署,随后执行生产冒烟测试。

对于 OINK 有意改变外壳的部分,应记录合理差异,而不是强求像素级相同。

回滚

保留迁移前的主题 pin、站点提交与已知可用部署产物。回滚时三者应一致恢复。针对新主题只重新引入一部分随机复制布局,会形成比任一完整版本都更难诊断的混合状态。