多个 profile 装同一个 dsh plugin:DeepSeek Harness 隔离与指定
同一个 dsh plugin 装到哪个 profile,就只对那个 profile 生效——装到 web 不会让它出现在桌面端,反之亦然。 因为每个 profile 有各自的 $DSH_HOME/profiles/<名字>/package.json 与 node_modules,而共用的只有会话、全局设置与凭据这一层。想让它到处可用,就逐个 profile 各装一遍;唯一装不进去的是桌面端独占的 desktop profile。
profile 之间默认互不可见:dsh plugin 装到 web 不等于装到 desktop
插件挂在 profile 上而不是机器上,这是「看不见」的根本原因。 三个要点:
- 每个 profile 是独立的一套:
$DSH_HOME/profiles/<名字>里有自己的package.json(dependencies与dsh.profile.bundles)、cordis.patch.yml与node_modules。装进 A 的插件不会出现在 B。 - 插件市场装插件也要指定 profile:在 DSH Plugin Hub 里点安装时,插件同样落进某个具体 profile,不是全局生效。想装到多个 profile,就在每个 profile 里各装一次。
- 同一插件装进两个 profile 是两个独立实例:它们各自有自己的配置与生命周期,改其中一个的设置不会影响另一个。
唯一的例外是 desktop profile:它由桌面端独占——桌面端在访问任何 profile 前会取得进程生命周期单实例锁,并独占 $DSH_HOME/profiles/desktop 及其包管理器状态,所以普通 CLI 与 npm 安装的 dsh 都不能启动或修改它,只有桌面端内置的命令可以在应用退出后管理它的插件(来源)。
逐个 profile 安装同一个 dsh plugin:写法、顺序与共用部分
写法很简单:同一条 add 命令换 --profile 的值,逐个执行一遍。 三种情形:
- 两个已知 profile 各装一次:
dsh plugin --profile web add <包名>
dsh plugin --profile desktop add <包名>
--profile 必填,它决定去哪份清单、哪个 node_modules 里动手,两条命令之间没有先后依赖(来源)。add 的完整写法见 dsh plugin add 命令。
-
装进一个新名字的 profile:不用先手工创建。profile 目录不存在时,dsh plugin 会先按模板初始化再执行 pnpm——
web这类内置 profile 用随附模板,其他名字用@deepseek-ai/dsh-base。所以第一条dsh plugin --profile 新名字 add <包名>就会把 profile 顺手建出来。 -
装进
desktopprofile:必须先启动一次桌面端让它把 profile 准备好,然后完全退出应用,再用桌面端内置的命令安装——普通 CLI 会被拒绝,也不会替你建一个同名的普通 profile。完整前提与限制见 桌面端 dsh 命令。
共用与不共用要分清:同一 $DSH_HOME 下,sessions、settings.yaml、.credentials.yaml 是共用的,所以换 profile 不用重配模型凭据;profiles/<名字> 是各自独立的,插件与依赖清单都按 profile 分开。目录结构见 DSH 配置文件在哪。
装完怎么逐个核对 dsh plugin 到底装进了哪个 profile
核对原则:每个 profile 各查一次,不共用结果。 三步:
- 列出本机有哪些 profile:
ls "$DSH_HOME/profiles"
预期:看到 web、headless、desktop 等你用过的名字;不确定 $DSH_HOME 就先 echo $DSH_HOME。
- 逐个 profile 查包:
dsh plugin --profile web list | grep -n "<包名>"
dsh plugin --profile desktop list | grep -n "<包名>"
有输出说明该 profile 里装了;一条都没有,说明这次没装到那里。list 的读法见 dsh plugin list 怎么用。
- 查加载层而不是只看包:
dsh --profile web --dump-config | grep -n "# =="
出现 # == <包名> 那一层,才说明它在这个 profile 里真的会被加载。包在 list 里但没有这一层,意味着装的是没声明 dsh.bundle 的普通依赖。
注意:desktop profile 的核对要用桌面端内置命令,普通 CLI 的 list 不会替你读到它。
DSH plugin 多 profile 安装的注意事项
记住一句话:插件跟着 profile 走,设置与会话跟着 $DSH_HOME 走。
- 装之前先想清楚要装进哪个 profile:装错的代价是白装一遍,还得回头卸载。
--profile不能省:省略会非零退出,而且它决定作用对象,写错名字会装进一个全新的空 profile。- 别把
desktopprofile 当成普通 profile 对待:普通 CLI 改不动它,装插件必须走桌面端内置命令。 desktopprofile 要先初始化:没启动过桌面端就执行内置命令,会以「profile 未初始化」被拒绝。- 多 profile 意味着多份维护成本:同一个插件装三处,将来就得升三次,按需装即可。
- 要确认某个插件到底在几个 profile 里:对每个候选 profile 各跑一次
list比对,别凭记忆。 - 切换 profile 不影响凭据:
settings.yaml与.credentials.yaml是共用的,换 profile 不用重配 API Key。

来源:DeepSeek Harness CLI README、DeepSeek Harness 桌面端 README、官方文档 - 打包与安装插件。
常见问题
**因为 dsh plugin 是装在 profile 上的,不是装在整台机器上的:装到 web 只对 web 这个 profile 生效。** 每个 profile 有各自的 $DSH_HOME/profiles/<名字>/package.json 与 node_modules,插件互不可见;桌面端用的是它独占的 desktop profile,所以要单独装一遍才看得到。
**同一个 dsh plugin 装到多个 profile,就是同一条 add 命令换 --profile 的值,逐个执行一遍。** 例如 dsh plugin --profile web add <包名> 与 dsh plugin --profile desktop add <包名> 各跑一次;--profile 必填,它决定去哪份清单和哪个 node_modules 里动手,顺序上没有依赖关系。
**多个 profile 共用 $DSH_HOME 时,dsh plugin 之外只有一层是共用的:会话、全局设置与凭据。** $DSH_HOME 下的 sessions、settings.yaml、.credentials.yaml 对同一 home 下所有 profile 生效,所以你换 profile 不用重配 API Key;而 profiles/<名字> 各自独立,插件、依赖清单与覆盖层都按 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
来源
- DeepSeek Harness CLI README(profile 与 dsh plugin 转发)· deepseek-ai
- DeepSeek Harness 桌面端 README(desktop profile 的归属与限制)· deepseek-ai
- DeepSeek Harness 官方文档 - 打包与安装插件· deepseek-ai