上一篇 DeepSeek Harness 第一个插件 写好了 hello-plugin 的源码,接下来我们把它加载进 Web UI。

这里我们会用到两个东西:patch 覆盖层 cordis.yml 和 –patch 启动参数。


scratch-plugin 目录结构

之前我们创建了 scratch-plugin/src,现在再加一个 cordis.yml。

整个临时项目的结构如下:

<span>scratch</span><span>-</span><span>plugin</span><span>/</span><span>
</span><span>├──</span><span> src</span><span>/</span><span>
</span><span>│</span><span>   </span><span>└──</span><span> </span><span>my</span><span>-</span><span>plugin</span><span>.</span><span>ts    </span><span># 插件源码(上一篇写的 hello-plugin)</span><span>
</span><span>└──</span><span> cordis</span><span>.</span><span>yml          </span><span># patch 覆盖层:告诉框架插入哪个插件</span>

cordis.yml 的 insert

在仓库根目录运行 pwd,拿到绝对路径。

然后创建 scratch-plugin/cordis.yml,内容如下:

实例

# 文件路径:scratch-plugin/cordis.yml
# 这是一个 Web 覆盖层(overlay),只负责插入本地插件
- insert:    - id: hello
      # name 是插件文件路径,必须是绝对路径!      name: ‘/absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts’

把 /absolute/path/to/deepseek-harness 替换成 pwd 打印的真实路径。

插件路径必须是绝对路径。

patch 文件只贡献配置,不会改变 loader 解析模块路径时使用的 profile 目录。


用 –patch 启动

用这个覆盖层启动 Web UI:

<span>pnpm dsh web </span><span>--</span><span>patch </span><span>./</span><span>scratch</span><span>-</span><span>plugin</span><span>/</span><span>cordis</span><span>.</span><span>yml</span>

启动期间,终端会打印 [hello-plugin] plugin loaded!。

打开 http://127.0.0.1:3080,在设置插件列表中搜索 hello,可以看到我们安装的插件。

patch 覆盖层加载流程


工作原理

dsh 把多个配置来源按顺序叠加成一个最终配置。

--patch 传入的 cordis.yml 是一个覆盖层,在启动时叠加进 profile。

概念 是什么 作用
profile 一份可启动的组装配置 决定 Web UI 由哪些组合包组成
patch 覆盖层 启动时额外叠加的 yml 插入本地插件、覆盖某项配置
insert patch 里插入插件的语法 按 name 绝对路径加载插件

提示:–patch 适合本地开发调试。

要把插件交付给其他人时,用组合包(bundle)的方式,见第 21 篇。