演进已部署站点的模式

本页内容

EmDash 将集合、字段和分类法与内容一起存储在数据库中。使用本指南更改运行中的内容模型,而不与代码部署、首次种子化或 EmDash 核心迁移混淆。示例使用 Cloudflare D1;相同的分离适用于每个数据库适配器

什么更改什么

站点经历四个不同的工作流程。每个工作流程影响不同的层:

工作流程更改的内容方式
内容编辑条目、媒体、设置管理面板或内容 API
代码部署模板、配置、EmDash 版本wrangler deploy — 可能迁移 EmDash 管理的数据库表
首次引导所有(从空开始)迁移 + 种子文件 + 设置向导,首次启动时自动
模式演进集合、字段、分类法管理面板或对运行站点执行 emdash schema(本页)

种子文件仅参与第三行。当数据库为空且设置向导未完成时应用一次。对现有数据库部署更改的种子文件不会产生任何效果 — 运行站点的模式演进始终通过管理面板或 API 进行。

在管理面板中更改模式

管理面板是演进已部署站点的主要方式。在管理界面中打开 Content Types,添加、编辑或删除集合和字段。更改立即生效 — 内容 API、加载器和编辑界面都在运行时从数据库读取模式。

有关可用的字段类型、验证规则和小部件选项,请参见集合与字段

更改模式后,重新生成模板使用的 TypeScript 类型。emdash types 命令从运行中的实例读取模式,因此可以直接指向已部署的站点:

npx emdash types --url https://example.com

从 CLI 更改模式

emdash schema 命令通过 REST API 与运行中的实例通信,因此它们对已部署的站点和本地开发的工作方式相同。使用设备流程进行一次认证:

npx emdash login --url https://example.com

或者,在管理界面的 设置 → API 令牌 下创建 API 令牌,并通过 --tokenEMDASH_TOKEN 环境变量传递 — 对 CI 很有用。

然后使用与本地相同的命令演进模式:

npx emdash schema add-field posts subtitle --type string --label "Subtitle" --url https://example.com
npx emdash schema remove-field posts legacy_field --url https://example.com
npx emdash schema create projects --label Projects --url https://example.com

这些命令可以检入脚本,使每个环境接收相同的有序更改。命令不是自动幂等的:对已存在的对象重新运行 createadd-field 可能会失败。使用 emdash schema listget 检查目标,记录哪个环境完成了每个步骤,并在第一个错误时停止。

完整命令列表请参见 CLI 参考

保持种子文件同步

构建中嵌入的种子文件决定了全新数据库初始化的内容:新的预览环境、灾难恢复重建或同一站点的第二次部署。如果种子仍然描述的是入门博客,而生产环境已经演进为其他内容,那么每个新环境都会用错误的模型引导。

构建嵌入在 .emdash/seed.jsonpackage.json#emdash.seed 中的路径或 seed/seed.json 中首先找到的种子文件。如果都不存在,则嵌入内置的默认种子(入门博客模型),astro dev 会记录警告。

演进已部署站点的模式后,将运行模型导出回您的仓库。emdash export-seed 读取本地 SQLite 文件,wrangler d1 export 从已部署的 D1 数据库生成:

npx wrangler d1 export emdash-db --remote --output=./prod.sql
sqlite3 prod.db < prod.sql
npx emdash export-seed --database prod.db > .emdash/seed.json

导出的种子包含运行站点的设置、集合、分类法、菜单和小部件区域。添加 --with-content 以包含条目。将更新的 .emdash/seed.json 与依赖新模式的代码一起提交,使新环境始终引导到代码理解的模型。

在预览环境中排练更改

破坏性的模式更改(删除字段、重构集合)最安全的做法是对生产的一次性副本进行排练。

  1. 创建单独的预览 D1 数据库,让 Wrangler 将其添加到 preview 环境:

    npx wrangler d1 create emdash-db-preview \
      --binding DB --env preview --update-config

    确认 env.preview.d1_databases 包含新的数据库名称和 UUID。绑定不会从顶层 Wrangler 配置继承。

  2. 导出生产数据,然后通过预览环境的 DB 绑定导入 SQL:

    npx wrangler d1 export emdash-db --remote --output=./prod.sql
    npx wrangler d1 execute DB --env preview --remote --file=./prod.sql
  3. 构建项目,将其部署到预览环境,然后对预览 URL 执行模式更改:

    npm run build
    npx wrangler deploy --env preview
    npx emdash schema remove-field posts legacy_field --url https://preview.example.com
  4. 验证公共页面、管理表单、生成的类型以及读取更改字段的任何模板。创建新的生产数据库备份,然后对生产执行一次相同的命令。

从错误中恢复

  • 字段被误删。 列及其数据已从运行数据库中消失。从 D1 Time Travel 时间点备份恢复,或重新添加字段并从之前的 wrangler d1 export 恢复其值。
  • 新环境用错误的模型引导。 嵌入的种子已过时或缺失。更新 .emdash/seed.json(参见保持种子文件同步),重新构建,并将部署指向空数据库以重新引导。
  • 模式与模板不一致。 部署和模式更改是独立的,因此要有意识地排序:添加性模式更改(新集合、新可选字段)在先,然后是使用它们的代码。对于删除,先部署停止使用该字段的代码,然后删除字段。