dsh plugin add 怎么用?DSH plugin 安装命令、--profile 必填、目标写法与装完验证

安装与快速上手发布于 2026-09-12作者: DeepSeek Plugin 插件市场
DeepSeek HarnessDSH plugindsh plugin add安装插件profile
dsh plugin add 是把插件装进指定 profile 的命令,--profile 必填,add 整条转发给 profile 目录里的 pnpm。目标三种写法:npm 包名、github:owner/repo 源码、本地目录或 .tgz;装完用 --dump-config 验证是否真生效。

dsh plugin add 的完整形态是 dsh plugin --profile <名字> add <目标>,三段各管一件事:dsh plugin 进入插件管理通道、--profile 指定改哪个 profile、add <目标> 就是 pnpm 的 add 动作。--profile 是必填项且没有短写,add 之后的参数会整条转发给 profile 目录里的 pnpm;装完用 dsh --profile <名字> --dump-config 就能确认插件有没有真的生效(来源)。

DSH plugin 命令概览:一条 add 拆成三段

dsh plugin --profile <name> <args...> 是 dsh 的插件管理通道,它把 --profile 之后的所有参数原样转发给该 profile 目录里的 pnpm,所以 add、remove、list 这些动词都是 pnpm 的动词(来源)。 DSH插件 与 DeepSeek插件 的安装、卸载、查看都走这条通道,先记住三段结构:

  1. dsh plugin:声明「我要动某个 profile 的插件依赖」,而不是启动应用;
  2. --profile <name>:指定目标 profile,对应目录 $DSH_HOME/profiles/<name>,必填且无短写;
  3. add <目标>:这一段整体传给 pnpm,所以 add、remove、list、update 乃至 pnpm 自己的参数都成立。

一句话:这是「dsh 帮你把 pnpm 跑在对的目录里,并顺手维护 profile 清单」的一条命令。

dsh plugin add 的语法:--profile 必填,add 整条转发给 pnpm

--profile 是必填参数,没有简写,省略后命令非零退出;而 --profile 之后的 add <目标> 会被原样转发给 profile 目录里的 pnpm(来源)。 完整走一遍:

  1. 确认目标 profile 的名字:内置的 webheadless 首次使用会从随包模板自动初始化,其他名字的 profile 必须由 dsh plugin 通道创建。启动 dsh web 用的就是 web 这个 profile。

  2. 执行安装命令,把插件装进 web profile:

bash
# 完整形态
dsh plugin --profile web add <包名>

# --profile 的等号写法同样成立
dsh plugin --profile=web add <包名>
  1. 看命令输出:pnpm 会打印依赖解析与安装进度;如果目标写错,报错会由 pnpm 抛出,命令以非零状态退出——CLI 层面「无效命令、参数错用、配置错误、启动失败」都返回非零(来源)。

  2. 观察 dsh 的后续动作:若这个包声明了 dsh.bundle,dsh 会把它追加进 profile 的组合包清单,这一步不是 pnpm 做的:

json
{
  "name": "dsh-profile-web",
  "private": true,
  "dependencies": {
    "<包名>": "…"
  },
  "dsh": {
    "profile": {
      "bundles": ["@deepseek-ai/dsh-base", "<包名>"]
    }
  }
}

首次初始化时,profile 会以 @deepseek-ai/dsh-base 作为它的第一个 bundle;此后每装一个带 dsh.bundle 的包,就按安装顺序追加一个(来源)。

一个必须知道的边界:包没声明 dsh.bundle 时依然会被装上,但只是普通依赖——dsh plugin 会打一条警告,并且不激活任何配置层。这类包是给插件当库用的,不是让用户直接启用的(来源)。

dsh plugin add 的目标写法:npm 包、GitHub 源码与本地目录

add 后面的目标决定插件从哪来:npm 包名最省事,github:owner/repo 拉的是源码要额外构建授权,本地目录与 .tgz 适合自测和内部分发。 三种照抄即可:

  1. npm 包——预构建产物,零授权:
bash
dsh plugin --profile web add <包名>
  1. GitHub 源码——拉源码而非构建产物,作者要有 prepare 脚本,你还要授权构建:
bash
# 基础写法
dsh plugin --profile web add github:owner/repo

# 建议锁 commit,防止后续推送悄悄改变实际运行的内容
dsh plugin --profile web add github:owner/repo#<sha>

第一次执行大概率失败:pnpm ≥10 默认拒绝运行 git 依赖的构建脚本,dsh 会把修法指给你——把 pnpm 打印的确切包键写进该 profile 的 pnpm-workspace.yaml

yaml
allowBuilds:
  <包名>: true

保存后重新执行 add。这段授权等于允许该包代码在安装时于你机器上执行,只对源码可信的包放开(来源)。

  1. 本地目录与 tarball——自测与内部分发:
bash
# 本地目录(以 link 形式装进 profile,改完即时生效)
dsh plugin --profile web add ./hello-plugin

# 作者用 pnpm pack 打出的压缩包
dsh plugin --profile web add ./hello-plugin-0.1.0.tgz

三条路线的取舍与授权差异,可以对照《DeepSeek Harness 插件从哪里安装?》里的来源对比表。

装完怎么验证 DSH plugin 真的生效

dsh --profile <name> --dump-config 能在不启动应用的前提下打印组合后的配置树,插件生效时会多出一个 # == <包名> 层;再对照 profile 的 package.json,包名要同时出现在 dependenciesdsh.profile.bundles 才算挂上了配置层(来源)。 按顺序做四步:

  1. 不启动,先看层
bash
dsh --profile web --dump-config | grep -n "== <包名>"

能看到 # == <包名> 这一层,说明 bundle 的 patch 已经进入组合树。

  1. 看 profile 清单,确认包名在 dependenciesdsh.profile.bundles 两处都在:
bash
cat ~/.dsh/profiles/web/package.json
  1. 列出已装插件,确认 pnpm 侧也认得它(--profile 之后的参数转发给 pnpm,所以 list 可用):
bash
dsh plugin --profile web list
  1. 启动应用看日志dsh web 启动时插件加载信息会打印在终端;启动后界面里的插件面板也应出现对应条目。

顺带记住层序,排查「配置没生效」时有用:bundle 层按 dsh.profile.bundles 顺序先铺,然后是 profile 自己的 cordis.patch.yml、再是 $DSH_HOME/cordis.patch.yml,最后才是命令行 --patch 覆盖层——后面的层按行取胜,且 patch 是整块替换 config 而不是深合并(来源)。

DSH plugin add 注意事项

一句话总结:--profile 不能省、目标写法决定要不要构建授权、没声明 dsh.bundle 的包装了也不会激活。 五条提醒:

  1. --profile 必填且无短写:它是定位 profile 目录的唯一依据,省略即非零退出,别指望有默认 profile 兜底;
  2. 启动器参数必须在前dsh --profile web --port 8080--port 属于 web 应用;启动器只解析自己的参数,第一个它不认识的词开始就是应用的参数(来源);
  3. GitHub 源是安全决策allowBuilds: true 等于放行安装期代码执行,务必配 #<sha> 锁版本;
  4. 装了不生效先查 dsh.bundle:打了警告却没激活层,说明这是库不是插件;
  5. 卸载用同一条通道dsh plugin --profile web remove <包名> 会同时移除依赖与配置层,不会留下空壳行。

装插件嫌命令行麻烦?用 DSH Plugin Hub 一键装

上面每个坑(目标写法记不住、GitHub 源授权、装了没激活)在图形界面里都能绕开。 装好 DSH Plugin Hub 后打开设置 → 插件市场,8,000+ 个社区插件按分类浏览,卡片直接点安装、实时进度、装前有信任确认弹窗与安装命令预览;GitHub 源缺构建产物这类问题,Hub 会在装前预检拦截,不会再出现「装完重启即崩」。命令行适合脚本化和自测,日常使用与其手记参数,不如让市场替你选对通道。

插件市场

来源:DeepSeek Harness 官方文档 - 打包与安装插件dsh CLI READMEdeepseek-ai/deepseek-harness

常见问题

dsh plugin add 后面必须带 --profile 吗?省略 --profile 会发生什么?

必须带,--profile 是 dsh plugin 通道的必填参数,省略后命令直接以非零状态退出、不会装任何东西。它没有 -p 这类简写,但支持 --profile=<name> 的等号写法。这个参数决定插件装进哪个 profile 目录,省略就无法定位目标。

dsh plugin add 支持哪些目标写法?npm 包、GitHub 源码和本地目录分别怎么写?

dsh plugin add 支持三种主流写法:npm 包直接写包名,GitHub 源码写 github:owner/repo,本地文件写路径如 ./hello-plugin 或 ./hello-plugin-0.1.0.tgz。本地目录写相对路径时会以 link 形式装进 profile,适合边改边调试;GitHub 源还可以用 github:owner/repo#<sha> 锁 commit。

dsh plugin add 装完怎么确认插件真的生效了,而不是白装一场?

验证 dsh plugin add 是否生效,执行 dsh --profile <name> --dump-config 即可:它能在不启动的前提下打印组合后的配置树,插件生效时会多出一个 # == <包名> 的层。再去 profile 目录看 package.json,确认包名同时出现在 dependencies 与 dsh.profile.bundles 两处,才算真的挂上了配置层。

为什么 dsh plugin add 提示成功,插件却没有任何效果、启动后也看不见?

dsh plugin add 报成功但插件没效果,多半是这个包没有声明 dsh.bundle。不声明 dsh.bundle 的包仍然会被安装,但只作为普通依赖存在,dsh plugin 会打一条警告且不激活任何配置层。这类包是给插件当库用的,不该由用户直接启用,需要换一个带 dsh.bundle 声明的包。

dsh plugin add 和直接进 profile 目录跑 pnpm add 有什么区别?

两者在依赖安装这一层是同一个动作,dsh plugin --profile <name> <args...> 会把参数原样转发给 profile 目录里的 pnpm。差别在 dsh 会在安装后维护 profile 的清单:包声明了 dsh.bundle 时,dsh 把它追加进 dsh.profile.bundles,直接跑 pnpm add 不会做这一步。

相关术语

dsh plugin add
dsh plugin add 是把插件包安装进指定 profile 的 DSH 命令,完整形态为 dsh plugin --profile <name> add <目标>。它把参数转发给 profile 目录中的 pnpm 执行,等价于在该目录里跑 pnpm add,并在包声明 dsh.bundle 时把包追加进 profile 的组合包清单。DeepSeek Harness 官方文档 - 打包与安装插件
--profile
--profile 是 dsh 启动器与 dsh plugin 插件管理通道共用的必填参数,用于指定命令作用于哪个 profile。它没有短写形式,同时支持 --profile <name> 与 --profile=<name> 两种写法。dsh CLI README
profile
profile 是 $DSH_HOME/profiles/<name> 下一个可运行的插件组合目录,由 package.json 中的 dsh.profile 清单与 cordis.patch.yml 覆盖层构成。dsh --profile <name> 启动的就是这个组合。DeepSeek Harness 官方文档 - 打包与安装插件
bundle(组合包)
bundle 是携带配置层的 npm 包,其 package.json 通过 dsh.bundle 声明要插入或覆盖的插件行。它是作者编写并分发的东西,profile 才是用户启动的东西,两者不会同时成立。DeepSeek Harness 官方文档 - 打包与安装插件

来源