DSH plugin 打包成 bundle:bundle 与 profile 的区别、三个文件与安装验证

简介: DeepSeek Harness(DSH)插件打包:用 package.json 的 dsh.bundle 声明 bundle、写 cordis.patch.yml 按包名插入行,再用 dsh plugin add 装进 profile 并用 --dump-config 验证配置层。

DeepSeek Harness(DSH)插件打包:用 package.json 的 dsh.bundle 声明 bundle、写 cordis.patch.yml 按包名插入行,再用 dsh plugin add 装进 profile 并用 --dump-config 验证配置层。

本文转自 DSH Plugin Hub 插件市场


DSH plugin 打包的本质是把你写好的插件变成一个携带配置层的 npm 包(bundle):package.json 用 dsh.bundle.patch 指向一份 cordis.patch.yml,这份 patch 里的插件行按包名引用模块;用户执行 dsh plugin --profile <name> add 后,这一层被追加进 profile 的 dsh.profile.bundles。 无论叫 DSH插件 还是 DeepSeek插件,打包要遵守的约束完全一致。

DSH plugin 的 bundle 与 profile:两个概念、两份 manifest

作者产出 bundle,用户启动 profile,两者不能混为一谈。 官方对这两个概念的界定很清晰(来源):

概念 是什么 manifest 字段 回答的问题
bundle 携带配置层的 npm 包 dsh.bundle 这个包贡献什么?
profile $DSH_HOME/profiles/<name> 下的组合目录 dsh.profile 哪些 bundle 按什么顺序组合?

「没有东西同时是两者」:bundle 是你编写并分发的,profile 是用户用 dsh --profile <name> 启动的。profile 永远不要手写——dsh plugin 会创建并维护它。

DSH plugin 最小可安装 bundle 的三个文件

一个可安装 bundle 只有三个文件。 官方结构如下:

hello-plugin/
├── package.json       # 声明 dsh.bundle
├── cordis.patch.yml   # profile 列出该 bundle 时应用的层
└── index.js           # patch 行引用的插件模块
{
   
  "name": "dsh-hello-plugin",
  "version": "0.1.0",
  "type": "module",
  "main": "index.js",
  "files": ["index.js", "cordis.patch.yml"],
  "dsh": {
    "bundle": {
    "patch": "./cordis.patch.yml" } }
}
export const name = 'hello-plugin'
export function apply() {
   
  console.log('[hello-plugin] plugin loaded!')
}

files 里必须包含 cordis.patch.yml,否则安装方拿不到配置层——插件装上了却不会被挂载,这是打包最常见的漏项。

少了 dsh.bundle 的包仍能安装,但只作为普通依赖、不激活任何层,dsh plugin 会给出警告。这个形态是给「被插件包 import 的库」用的,不是给用户启用的插件。

DSH plugin 的 cordis.patch.yml 怎么写

打包后的 patch 按包名引用模块,不写源码路径。 官方最小写法:

- insert:
    - id: hello
      name: dsh-hello-plugin

与本地调试的区别只有一处:覆盖层里写的是绝对路径(因为 loader 从 profile 目录解析模块),而 bundle 里写包名,交给 Node 模块解析去找已安装的代码。本地调试见 本地调试。

把 DSH plugin 装进 profile 并验证

dsh plugin --profile <name> <args...> 会把参数转发给 profile 目录里的 pnpm,所以任何 pnpm 动词都可用。 从包含 hello-plugin 的目录执行(来源):

  1. 装进 profile:dsh plugin --profile demo add ./hello-plugin。首次使用会初始化 profile(以 @deepseek-ai/dsh-base 作为第一个 bundle),然后把你的包链接进去并追加到 dsh.profile.bundles。
  2. 先不启动,检查配置层:dsh --profile demo --dump-config,预期能看到一条 # == dsh-hello-plugin 层。
  3. 再启动:dsh --profile demo,预期看到插件加载日志、行为生效。

卸载用同一条通道:dsh plugin --profile demo remove dsh-hello-plugin,它会同时移除依赖与该层。层顺序的完整规则见 本地调试。

DSH plugin 的层顺序与「整行替换」的坑

理解两件事就能避免绝大多数「装了没生效」和「覆盖后配置丢了」。

  1. 层顺序:bundle patch(按 dsh.profile.bundles 顺序)→ profile 自己的 cordis.patch.yml → 家目录 $DSH_HOME/cordis.patch.yml → --patch 覆盖层;越靠后越优先。
  2. 整行替换、不做深合并:patch 按行覆盖 config 时,必须重述该行需要的每一个 key,只写改动项会丢掉其余 key。

由此得到两条打包建议:① 你的 patch 可以按 id 覆盖前层的行(官方 dsh-web-app 就是这样覆盖 dsh-base 的),但要写全;② 用户可以不改你的包、在自己的 profile 里覆盖你的行,所以默认值应当设成用户大概率会保留的值,剩下的交给 schema 兜底。

让 DSH plugin bundle 带上自己的命令行(进阶)

需要自定义启动参数时,挂一个 provider 插件即可,launcher 不需要改。 做法是让插件 inject = ['cmdlineArgs'],用 @deepseek-ai/dsh-cmdline 的 parseCmdline 解析自己那套 commander 程序,并从 action 里提供 app 自有服务;需要读这些参数的行再注入该服务,并用 !!js 取值:

- id: my-app
  name: '@example/my-app'
  inject: [myAppStartup]
  config:
    port: !!js ctx.myAppStartup.port ?? 8080

--help 时 provider 不发布服务,这些行就不会激活——这正是「帮助信息不该触发业务行」的实现方式。

本地可安装之后,下一步是选择分发方式:走 npm 发包见 发布到 npm;提交到插件目录收录见 发布到插件中心。装好后可在 DSH Plugin Hub 核对已安装列表与配置项。写代码阶段的硬性自检项见 开发规范。


常见问题

DSH plugin 的 bundle 和 profile 有什么区别?

在 DSH plugin 体系中,bundle 是你编写并分发的 npm 包,profile 是用户启动时用的组合目录。 两者都用 package.json 描述,但 manifest 挂在 dsh 键下的不同字段:bundle 声明 dsh.bundle(回答「这个包贡献什么」),profile 声明 dsh.profile(回答「哪些 bundle 按什么顺序组合」)。没有东西同时是两者(来源:官方「打包与安装插件」)。

DSH plugin 打包最少需要几个文件?

一个 DSH plugin 打包最少需要三个文件:package.json(声明 dsh.bundle.patch 指向 patch 文件)、cordis.patch.yml(profile 列出该 bundle 时应用的层)、以及插件入口文件。官方最小示例的 package.json 还带 type: module、main 与 files(必须包含入口与 patch 文件,否则安装方拿不到配置层)。

DSH plugin 的 cordis.patch.yml 里插件行怎么写?

DSH plugin 的 cordis.patch.yml 里插件行按包名引用,而不是相对源码路径。 打包后的 patch 是一个 YAML 数组,行里写 name: dsh-hello-plugin 这样的包名,交给 Node 的模块解析去找已安装的代码;本地调试阶段那种绝对路径写法只适用于 --patch 覆盖层(来源:官方「打包与安装插件」)。

package.json 里少了 dsh.bundle 会怎样?

DSH plugin 的 package.json 里少了 dsh.bundle 仍然能装,但只作为普通依赖,不会激活任何配置层——dsh plugin 会打印警告。这个形态适用于「被插件包 import 的库」,而不是用户要启用的插件。所以打包插件时漏掉 dsh.bundle 的表现是「装上了但没生效」(来源:官方「打包与安装插件」)。

为什么 DSH plugin 的 patch 覆盖别人一行时要重述所有 key?

因为 DSH plugin 的 patch 是按行整行替换 config,不做深合并。你的 patch 可以按 id 覆盖前层的行,但必须把该行需要的每一个 key 都重新写全,只写改动的那一个会把其余 key 丢掉。同理,用户可以不改你的包就在自己的 profile 里覆盖你的行,所以默认值最好设成用户愿意保留的值(来源:官方「打包与安装插件」)。


本文转自 DSH Plugin Hub 插件市场,版权归属 DSH Plugin Hub 插件市场。

分类:插件开发

原文地址:https://dsh-plugin.org/zh/tutorials/develop-plugin-bundle

首页:DSH Plugin Hub

相关文章
|
23天前
|
JavaScript API 开发工具
DeepSeek Harness 源码怎么构建?DSH plugin 本地开发调试与源码版 npx 差异指南
DeepSeek Harness 从源码构建分五步:装 Node.js 与 pnpm → git clone → pnpm install → pnpm run build → pnpm dsh 启动。源码版最适合本地开发 DSH plugin——dsh plugin 会把参数原样转发给 pnpm,支持本地路径调试;开发完可提交到 DSH Plugin Hub 收录。
219 3
DeepSeek Harness 源码怎么构建?DSH plugin 本地开发调试与源码版 npx 差异指南
|
1月前
|
开发工具 git 开发者
DeepSeek Harness 更新后 DSH plugin 不兼容?插件版本回滚与降级操作指南
DSH plugin 更新后不兼容的典型症状是功能缺失、加载报错。回滚插件或降级 DSH 本体可恢复,升级前看插件详情页与 DSH Plugin Hub 的兼容状态能避免,本文给出症状、回滚命令与预防方法。
849 1
|
Linux 开发工具 iOS开发
16 个 Linux 最佳 Markdown 编辑器(1)
16 个 Linux 最佳 Markdown 编辑器(1)
|
2月前
|
缓存
dsh plugin 命令怎么用?DSH 插件安装、卸载、列出命令大全
dsh plugin 是管理 DSH 插件的命令族:add 安装、remove 卸载、list 列出,都配合 --profile 指定环境。安装有 npm 包名、GitHub 源码、本地目录、市场图形化四种方式,卸载有命令行与界面两种,本文逐个展开步骤并附常见问题排查。
2432 1
dsh plugin 命令怎么用?DSH 插件安装、卸载、列出命令大全
|
24天前
|
缓存 Linux iOS开发
DeepSeek Harness 自动更新怎么开?dsh 本体自动更新与插件升级提醒的做法
DeepSeek Harness 本体没有自动更新开关:最省事是用 npx 启动(每次按最新解析),全局安装则用系统计划任务定时跑 npm install -g @latest;插件侧另有启动时检查更新与可更新徽标。
286 1
DeepSeek Harness 自动更新怎么开?dsh 本体自动更新与插件升级提醒的做法
|
2月前
|
存储 开发工具 git
DeepSeek Harness 更新会丢配置吗?dsh 升级后会话、插件保留说明与更新前备份
更新 dsh 只换程序本体,不动数据:密钥在 $DSH_HOME/.credentials.yaml、profile 在 $DSH_HOME/profiles、会话数据都独立保留。本文说明更新到底动什么、备份哪些目录,以及升级后怎么验证插件没坏。
398 3
DeepSeek Harness 更新会丢配置吗?dsh 升级后会话、插件保留说明与更新前备份
|
2天前
|
人工智能 自然语言处理 前端开发
Qoder怎么样?实测Qoder AI Coding体验感拉满,部分AI模型限时免费中~
阿里云Qoder是智能体自主开发工作台,支持一句话生成可运行网页应用(如贪吃蛇小游戏),集成Qwen3.8-Max/Flash等大模型,新用户享限时免费额度。项目、代码、执行全程可视化,支持一键部署为可分享链接,零门槛高效开发。(239字)
|
23天前
|
缓存 Shell Linux
dsh 更新了版本没变怎么办?DeepSeek Harness 多份安装、PATH 与缓存排查
dsh 更新了版本没变,先分清三层:磁盘上的包、PATH 命中的命令、正在跑的进程。最常见是服务没重启与多份安装;本文给 which -a、npm root -g、hash -r 与缓存、镜像滞后的逐项排查。
208 3
|
23天前
|
JavaScript 开发者
DSH plugin 从零怎么写?最小插件目录、本地构建与装进 profile 调试的完整起步流程
写第一个 DSH plugin 只需要一个导出 apply 函数的模块:先用 patch 覆盖层把本地文件插进 Web 界面验证,再做成包用 dsh plugin --profile add 装进 profile,最后用 --dump-config 与日志排错。
183 2
|
9天前
|
JSON 编译器 开发工具
DSH plugin 开发常见错误:插件不加载、停在 PENDING、execute 契约越界与卡片渲染非纯函数的修法
DSH plugin 开发常见错误速查:插件不加载、停在 PENDING、apply 转 FAILED、execute 返回值越界、卡片渲染做了 I/O、bundle 漏 patch 文件——按症状定位根因与修法。

热门文章

最新文章