dsh-plugin-manager:在 dsh web GUI 里一键启用 / 禁用已安装插件

前言

用 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 自带的 watchUserPatches HMR:补丁文件变化后重新组合 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 提供的 webServerloaderslotswatchUserPatches 行为,老版本不保证可用。
  • 管理器自身不可被自己禁用,否则会失去重新启用的入口。
  • 自动编辑只针对「纯 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 / 幻方无官方从属关系。)

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜