多个 profile 装同一个 dsh plugin:DeepSeek Harness 隔离与指定

安装与快速上手发布于 2026-10-01作者: DeepSeek Plugin 插件市场
DeepSeek HarnessDSH pluginprofile 隔离dsh --profiledesktop profile
同一个 dsh plugin 装到哪个 profile 就只对哪个环境生效:profiles 之间默认互不可见,共用 $DSH_HOME 的只有会话、设置与凭据。本文给出逐个 profile 的安装写法、desktop profile 的独占限制,以及装完后逐个 profile 核对归属的办法。

同一个 dsh plugin 装到哪个 profile,就只对那个 profile 生效——装到 web 不会让它出现在桌面端,反之亦然。 因为每个 profile 有各自的 $DSH_HOME/profiles/<名字>/package.json 与 node_modules,而共用的只有会话、全局设置与凭据这一层。想让它到处可用,就逐个 profile 各装一遍;唯一装不进去的是桌面端独占的 desktop profile。

profile 之间默认互不可见:dsh plugin 装到 web 不等于装到 desktop

插件挂在 profile 上而不是机器上,这是「看不见」的根本原因。 三个要点:

  1. 每个 profile 是独立的一套:$DSH_HOME/profiles/<名字> 里有自己的 package.json(dependencies 与 dsh.profile.bundles)、cordis.patch.yml 与 node_modules。装进 A 的插件不会出现在 B。
  2. 插件市场装插件也要指定 profile:在 DSH Plugin Hub 里点安装时,插件同样落进某个具体 profile,不是全局生效。想装到多个 profile,就在每个 profile 里各装一次。
  3. 同一插件装进两个 profile 是两个独立实例:它们各自有自己的配置与生命周期,改其中一个的设置不会影响另一个。

唯一的例外是 desktop profile:它由桌面端独占——桌面端在访问任何 profile 前会取得进程生命周期单实例锁,并独占 $DSH_HOME/profiles/desktop 及其包管理器状态,所以普通 CLI 与 npm 安装的 dsh 都不能启动或修改它,只有桌面端内置的命令可以在应用退出后管理它的插件(来源)。

逐个 profile 安装同一个 dsh plugin:写法、顺序与共用部分

写法很简单:同一条 add 命令换 --profile 的值,逐个执行一遍。 三种情形:

  1. 两个已知 profile 各装一次:
bash
dsh plugin --profile web add <包名>
dsh plugin --profile desktop add <包名>

--profile 必填,它决定去哪份清单、哪个 node_modules 里动手,两条命令之间没有先后依赖(来源)。add 的完整写法见 dsh plugin add 命令。

  1. 装进一个新名字的 profile:不用先手工创建。profile 目录不存在时,dsh plugin 会先按模板初始化再执行 pnpm——web 这类内置 profile 用随附模板,其他名字用 @deepseek-ai/dsh-base。所以第一条 dsh plugin --profile 新名字 add <包名> 就会把 profile 顺手建出来。

  2. 装进 desktop profile:必须先启动一次桌面端让它把 profile 准备好,然后完全退出应用,再用桌面端内置的命令安装——普通 CLI 会被拒绝,也不会替你建一个同名的普通 profile。完整前提与限制见 桌面端 dsh 命令。

共用与不共用要分清:同一 $DSH_HOME 下,sessions、settings.yaml、.credentials.yaml 是共用的,所以换 profile 不用重配模型凭据;profiles/<名字> 是各自独立的,插件与依赖清单都按 profile 分开。目录结构见 DSH 配置文件在哪。

装完怎么逐个核对 dsh plugin 到底装进了哪个 profile

核对原则:每个 profile 各查一次,不共用结果。 三步:

  1. 列出本机有哪些 profile:
bash
ls "$DSH_HOME/profiles"

预期:看到 web、headless、desktop 等你用过的名字;不确定 $DSH_HOME 就先 echo $DSH_HOME。

  1. 逐个 profile 查包:
bash
dsh plugin --profile web list | grep -n "<包名>"
dsh plugin --profile desktop list | grep -n "<包名>"

有输出说明该 profile 里装了;一条都没有,说明这次没装到那里。list 的读法见 dsh plugin list 怎么用。

  1. 查加载层而不是只看包:
bash
dsh --profile web --dump-config | grep -n "# =="

出现 # == <包名> 那一层,才说明它在这个 profile 里真的会被加载。包在 list 里但没有这一层,意味着装的是没声明 dsh.bundle 的普通依赖。

注意:desktop profile 的核对要用桌面端内置命令,普通 CLI 的 list 不会替你读到它。

DSH plugin 多 profile 安装的注意事项

记住一句话:插件跟着 profile 走,设置与会话跟着 $DSH_HOME 走。

  1. 装之前先想清楚要装进哪个 profile:装错的代价是白装一遍,还得回头卸载。
  2. --profile 不能省:省略会非零退出,而且它决定作用对象,写错名字会装进一个全新的空 profile。
  3. 别把 desktop profile 当成普通 profile 对待:普通 CLI 改不动它,装插件必须走桌面端内置命令。
  4. desktop profile 要先初始化:没启动过桌面端就执行内置命令,会以「profile 未初始化」被拒绝。
  5. 多 profile 意味着多份维护成本:同一个插件装三处,将来就得升三次,按需装即可。
  6. 要确认某个插件到底在几个 profile 里:对每个候选 profile 各跑一次 list 比对,别凭记忆。
  7. 切换 profile 不影响凭据:settings.yaml 与 .credentials.yaml 是共用的,换 profile 不用重配 API Key。
DSH Plugin Hub 插件市场:在插件市场里安装插件时同样要落到某个具体 profile

来源:DeepSeek Harness CLI README、DeepSeek Harness 桌面端 README、官方文档 - 打包与安装插件。

常见问题

为什么我把 dsh plugin 装到 web,打开桌面端却看不到它?

**因为 dsh plugin 是装在 profile 上的,不是装在整台机器上的:装到 web 只对 web 这个 profile 生效。** 每个 profile 有各自的 $DSH_HOME/profiles/<名字>/package.json 与 node_modules,插件互不可见;桌面端用的是它独占的 desktop profile,所以要单独装一遍才看得到。

同一个 dsh plugin 要装到多个 profile,命令怎么写?

**同一个 dsh plugin 装到多个 profile,就是同一条 add 命令换 --profile 的值,逐个执行一遍。** 例如 dsh plugin --profile web add <包名> 与 dsh plugin --profile desktop add <包名> 各跑一次;--profile 必填,它决定去哪份清单和哪个 node_modules 里动手,顺序上没有依赖关系。

多个 profile 装同一个 dsh plugin 时共用 $DSH_HOME,哪些东西是共用的?

**多个 profile 共用 $DSH_HOME 时,dsh plugin 之外只有一层是共用的:会话、全局设置与凭据。** $DSH_HOME 下的 sessions、settings.yaml、.credentials.yaml 对同一 home 下所有 profile 生效,所以你换 profile 不用重配 API Key;而 profiles/<名字> 各自独立,插件、依赖清单与覆盖层都按 profile 分开。

dsh plugin 能装进 desktop profile 吗?为什么会被拒绝?

**能,但 dsh plugin 只能用桌面端内置的命令装进 desktop profile,普通 CLI 与 npm 安装的 dsh 都改不了它。** 桌面端在访问任何 profile 前会拿一个进程生命周期单实例锁,并独占 $DSH_HOME/profiles/desktop 及其包管理器状态;还要先启动一次桌面端让它初始化好这个 profile,否则内置命令也会以「profile 未初始化」拒绝。

相关术语

profile 隔离
profile 隔离指 DeepSeek Harness 按 profile 组织插件层:每个 profile 有自己的 package.json、node_modules 与配置覆盖层,装在某一个 profile 里的插件不会出现在另一个 profile。它是「装到 web 不等于装到 desktop」的机制来源。— https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/README.md
desktop profile
desktop profile 是 DeepSeek Harness 桌面端独占的 profile,位于 $DSH_HOME/profiles/desktop。桌面端在访问任何 profile 前取得进程生命周期单实例锁并独占它及其包管理器状态,因此普通 CLI 与 npm 安装的 dsh 都无法启动或修改它。— https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/desktop/README.zh.md
共享层(shared layer)
共享层是同一 $DSH_HOME 下被所有 profile 共用的数据:sessions 会话目录、settings.yaml 全局设置与 .credentials.yaml 凭据。换 profile 时这一层不变,所以模型配置与聊天记录不需要在每个 profile 里重来一遍。— https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/README.md
profile 初始化
profile 初始化指 profile 目录不存在时,dsh plugin 会先按模板生成它再执行 pnpm:web 这类内置 profile 用随附模板,其他名字用 @deepseek-ai/dsh-base。因此新名字的 profile 无需手工创建,第一条带 --profile 的命令就会顺手建出来。— https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/reference/README.md

来源