前言¶
用 DSH 的人大多認可「一切皆插件」的思路:功能按需掛載,用不上就摘掉。但實際操作中,啓用或禁用一個插件往往意味着打開 profile 的 cordis.patch.yml,手寫 disabled: true,再重啓 web 服務確認效果。插件一多,這套流程會很瑣碎。
dsh-plugin-manager 把這件事搬進了 web GUI:列出當前 profile 已下載的插件,用按鈕一鍵啓用 / 禁用,改動持久化到補丁文件並立即生效。下面介紹它的功能、安裝方式和使用注意。
這是什麼¶
dsh-plugin-manager 由 Mg-K-Mn 維護,定位是 DSH web GUI 內的「已安裝插件管理器」。它在設置頁新增一個標籤頁,把當前 profile 已下載(已安裝)的插件列出來,並允許隨時切換啓用 / 禁用狀態,不需要每次手改 YAML 或重啓服務。
它的改動會持久化寫入 profile 的 cordis.patch.yml,所以刷新、重啓之後狀態仍然保留。
需要說明:它只負責條目級的啓用 / 禁用。安裝和卸載插件仍請使用插件市場(dsh-webui-market-plugin)或 dsh plugin --profile web add/remove。
核心功能¶
- 在 web GUI 內列出當前 profile 已下載的插件,顯示包名、版本、來源 spec、描述。
- 每張卡片顯示該包在 Cordis Loader 樹裏的運行時條目(id / 模塊 / fiber 狀態)。
- 一鍵啓用 / 禁用:
- 禁用:把該包所有條目的
- id: …+disabled: true寫入 profile 的cordis.patch.yml。 - 啓用:從 profile 和 home 兩級
cordis.patch.yml中移除對應的純禁用行。 - 對「已下載但未接線」的包,點擊啓用會把包內
cordis.patch.yml的插入行寫入 profile 補丁,完成接線。 - 依賴 dsh 自帶的
watchUserPatchesHMR:補丁文件變化後重新組合 Loader 樹,改動立即生效、無需重啓;涉及瀏覽器 UI 的插件刷新頁面即可看到。 - 搜索框按包名 / 描述 / 條目 id 過濾。
- 展開詳情可查看運行時 Loader 條目,加載失敗的條目會標紅。
- 頁面底部只讀展示 profile 的組合層(bundles),區分「已下載依賴」與「內置組合包」。
實現上,插件分兩半:Host 半(lib/host.js)註冊 /api/dsh-plugin-manager 路由,讀取 profile 的 package.json 和包內 cordis.patch.yml,並投影運行時的 Loader 條目;Client 半(lib/client.js)註冊到 settings.plugins.tab 槽位(order 6,排在官方插件列表 / 插件市場之後),渲染前端面板。
安裝與啓用¶
下面給出三種安裝方式,按需選擇其一。
方式一:從 GitHub 安裝(推薦)¶
執行:
dsh plugin --profile web add github:Mg-K-Mn/dsh-plugin-manager
安裝完成後重啓 web 服務生效:
dsh web
方式二:從本地目錄安裝¶
克隆或下載倉庫後,進入含 package.json 的倉庫根目錄執行:
dsh plugin --profile web add .
注意相對路徑按執行命令時所在目錄解析:如果在倉庫父目錄執行,則寫 dsh plugin --profile web add ./dsh-plugin-manager。安裝後同樣重啓 web 服務生效。
方式三:免重啓手動接線(調試 / 立即使用)¶
把插件目錄放到 profile 的 node_modules 下,並在 ~/.dsh/profiles/web/cordis.patch.yml 末尾追加:
- insert:
- id: dsh-plugin-manager
name: dsh-plugin-manager
dsh 的 patch HMR 會立即掛載宿主 API,刷新瀏覽器後即可在設置 → 插件中看到標籤頁。
切換安裝方式時的注意¶
如果已經用方式三把 dsh-plugin-manager 寫進了 profile 的 cordis.patch.yml,改用方式一或方式二前,請先刪除對應的 - insert: 塊再重啓。否則 bundle 層與 profile 補丁會各自掛載一次本插件,重複註冊同一 API 路由會導致啓動失敗。
日常使用¶
經過上面的安裝步驟,打開 設置(Settings)→ 插件(Plugins)→ 已安裝插件(Installed Plugins):
1、在搜索框按包名 / 描述 / 條目 id 過濾目標插件。
2、每張卡片右側按鈕按當前狀態顯示「啓用」或「禁用」,點擊後狀態即時生效。
3、展開「詳情」查看運行時 Loader 條目;加載失敗的條目會標紅。
4、頁面底部只讀展示 profile 的組合層(bundles)。
適用場景與注意¶
適合的場景:插件數量多、需要頻繁試開試關的 DSH 用戶;不想反覆手改 cordis.patch.yml、或希望改動即時生效不必重啓服務的環境。
使用前後的幾點注意:
- 依賴 dsh 0.1.0-rc.x 提供的
webServer、loader、slots與watchUserPatches行爲,老版本不保證可用。 - 管理器自身不可被自己禁用,否則會失去重新啓用的入口。
- 自動編輯只針對「純
id+disabled: true」行。帶額外配置的禁用行會在 UI 提示手工編輯,不會擅自刪除;home 級cordis.patch.yml中更晚應用的複雜覆蓋也不會自動猜測,界面會如實顯示並提示手工處理。 - 對運行時已被其他 patch 層覆蓋出額外
config的條目,禁用只添加disabled: true,不影響原配置。 - 寫操作只接受同源 POST(Origin 與 Host 一致),與 dsh-webui-market-plugin 的策略一致;補丁文件採用臨時文件 + rename 的原子寫入,連續點擊由隊列串行化。
- 插件以當前 dsh 進程的權限運行,安裝前建議檢查其源碼與許可證。該項目採用 MIT 許可證。
結尾¶
dsh-plugin-manager 解決的是一個具體的小問題:讓已安裝插件的啓用 / 禁用從「改文件、重啓服務」變成「點一下按鈕」,且改動持久化、即時生效。對插件越裝越多的 DSH 環境來說,是個省事的補充。
插件目錄頁:https://www.skillhub.cn/plugins/Mg-K-Mn/dsh-plugin-manager
GitHub 倉庫:https://github.com/Mg-K-Mn/dsh-plugin-manager
(skillhub.cn 爲獨立的社區插件目錄,與 DeepSeek / 幻方無官方從屬關係。)