更新 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 及其官方整合。
  • 要回到上一發佈,重新安裝符合的先前套件版本並重新部署該產物。重新安裝不會撤銷核心遷移。若先前產物無法使用已遷移資料庫,停止流量並一起還原更新前的資料庫與產物;僅當更新變更了媒體時才還原媒體。