更新 EmDash

本页内容

本指南面向站点运营者:运行基于 EmDash 的站点并希望升级到更新版本的人。涵盖 emdash 包与 @emdash-cms/cloudflare。插件包有自己的指南 在站点上升级插件,对自有集合与字段的更改见 演进已部署站点。

发布与版本号

EmDash 在 1.0 版本之前发布,其版本号遵循两条规则:

  • 补丁版本,例如从 0.35.0 到 0.35.1,包含错误修复与小改进。
  • 次要版本,例如从 0.35 到 0.36,包含新功能与任何破坏性更改。破坏性更改在其发布条目中标为 Breaking,且条目说明要求你采取的操作。

emdash 与 @emdash-cms/cloudflare 一起发布并共享一个版本号。@emdash-cms/cloudflare 依赖精确匹配的 emdash 版本,因此请一步更新这两个包。诸如 @emdash-cms/plugin-forms 的插件包有自己的版本号,并声明所需的最低 emdash 版本。

发布页面 每个包与版本有一条条目。更新前,阅读已安装版本与目标之间的 emdash 条目;若站点运行在 Cloudflare 上,也对 @emdash-cms/cloudflare 阅读同一范围。

更新之前

做可恢复的数据库备份,以及单独的媒体存储备份。EmDash 的 JSON 导出无法恢复站点,核心迁移没有可操作的撤销步骤。备份与恢复 说明了每个数据库可用的恢复点。

检查构建站点的机器上的 Node.js 版本;对于 Node.js 部署,还要检查服务器上的版本。入门 列出了支持的版本。

更新包

以下命令使用 pnpm 以及从 Cloudflare 模板创建的站点。对于 Node.js 部署,省略 @emdash-cms/cloudflare。

  1. 检查已安装版本与最新发布。

    pnpm outdated emdash @emdash-cms/cloudflare
  2. 将两个包移到最新发布。

    模板生成的 package.json 以诸如 ^0.35.0 的 caret 范围列出包。对于低于 1.0 的版本,caret 范围仅允许补丁发布(0.35.1,不是 0.36.0),且不带其他选项的 pnpm up 会留在该范围内。--latest 标志将范围重写为最新发布并安装它。

    pnpm up --latest emdash @emdash-cms/cloudflare

    将 package.json 中的插件包加入同一命令。

  3. 构建站点。

    pnpm build

    构建会写入已安装版本的迁移清单。若构建失败,见 更新后站点损坏时。

  4. 在本地启动站点,并打开 /_emdash/admin 管理端。

    pnpm dev

    EmDash 集成在开发服务器启动时生成 emdash-env.d.ts。待处理的核心迁移在首次请求时运行。

部署并验证

像其他更改一样部署构建。以下命令部署 Cloudflare 站点;对于 Node.js 部署,用新构建重启服务器进程。

pnpm wrangler deploy

使用默认运行时迁移模式 auto 时,已部署站点在首次请求时应用待处理的核心迁移。若要在新代码接收流量之前应用它们,并在之后验证已部署数据库,请遵循 管理核心数据库迁移。其 emdash migrate --check 命令在已部署数据库对已安装版本有待处理或未知迁移时以非零退出。

部署后,打开管理端,加载至少一个公开页面,编辑并发布一条临时条目,并上传与检索一个临时媒体文件。若站点使用定时任务或沙箱插件,也请验证那些路径。

特定发布说明

大多数发布只需完成上述步骤。以下条目涵盖更改了 EmDash 已存储数据的发布,并说明何时需要你采取行动。

已更改:引用字段绑定到 relations

过去,reference 字段将目标条目的 ID 保存在其集合表的一列中,并在管理面板无法设置的字段选项中命名其目标集合。

引用字段现在是由 relation 支撑的条目选择器,其链接位于集合表之外。更新会将每个命名了目标集合的引用字段绑定到新 relation,并将其列中的条目 ID 复制为链接,使该字段成为保留选择的选择器。列保留在原处,更新不删除任何内容。

在以下情况下字段保持未绑定:

  • 未命名目标集合,或命名了不再存在的集合
  • 标为 searchable 或 indexed
  • 需要 relation slug {collection}_{field} 且该 slug 已被占用
  • 在同一条目的不同语言区域中选择了不同条目(在任何条目上)

最后一点关乎链接的存放位置。链接属于条目的翻译组,因此一个 选择由其所有翻译共享,而旧列是按语言区域的。语言区域不一致的 字段没有单一选择可迁移——合并会把另一方的条目交给每个语言区域, 挑选一个语言区域的答案会丢弃其余——因此更新会留下该 字段,并让两个值在列中可读。

两种看起来像不一致的情况其实不是。命名同一条目各自翻译的 语言区域只选择了该条目一次,因此更新会绑定字段,链接解析到每个 语言区域自己的版本。未选择任何内容的语言区域不与其他语言区域矛盾,因此更新 绑定字段,组的一个选择适用于每个翻译,包括空的那个。

未绑定字段的行为与以前相同。其列保存条目 ID,值可保存与加载,字段仍可建索引并用作内容列表筛选器。在条目编辑器中它渲染为文本框而非选择器。

我该做什么?

在每个有引用字段的集合中打开一条条目。渲染为选择器的字段无需操作。对于仍渲染为文本框的字段,遵循 绑定没有 relation 的字段,它会创建 relation 并将字段已存储的 ID 复制为链接。在多语言站点上,绑定前先确定每个翻译应指向哪个条目,因为绑定会为所有翻译保留一个选择。

更新后站点损坏时

  • 构建失败,或自有页面在运行时出错:阅读你跳过的版本中标为 Breaking 的发布条目,并按说明更改。
  • 插件无法加载:阅读插件自己的发布条目与 在站点上升级插件。
  • 错误点名 Astro API 或 @astrojs/* 包:EmDash 需要 Astro 6 或更高。Astro 的 升级指南 说明如何一起更新 astro 及其官方集成。
  • 要回到上一发布,重新安装匹配的先前包版本并重新部署该产物。重新安装不会撤销核心迁移。若先前产物无法使用已迁移数据库,停止流量并一起恢复更新前的数据库与产物;仅当更新更改了媒体时才恢复媒体。