演進已部署站點的結構描述

本頁內容

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(參見保持種子檔案同步),重新建置,並將部署指向空資料庫以重新引導。
  • 結構描述與範本不一致。 部署和結構描述變更是獨立的,因此要有意識地排序:新增性結構描述變更(新集合、新可選欄位)在先,然後是使用它們的程式碼。對於刪除,先部署停止使用該欄位的程式碼,然後刪除欄位。