本篇拆解你在 dsh 日常使用里会遇到的两个名词 —— profile 与 bundle —— 以及把二者串起来的 dsh plugin 命令。下方每条断言都能溯源到抓取的上游文档:CLI 参考(apps/cli/reference/README.md)、架构概述(docs/architecture.md)、打包与发布插件教程(docs/user/develop/basic/publish.md)。
profile 是什么
按架构概述,profile 是 home 里一个有名有姓的组合。它住在 $DSH_HOME/profiles/<name>,身上挂着三件东西:
- 它要叠加的 bundle(按顺序写在
dsh.profile.bundles清单里) - 它在 pnpm 里安装的所有外部插件
- 用户自己的
cordis.patch.yml—— 叠在每个 bundle 之上的覆盖
官方发行两个 profile,首次使用时自动从模板初始化:web(base + web-app)与 headless(base + headless)。其他名字会直接报错,并提示 dsh plugin --profile <name> add <package>。
dsh --profile <name> 的启动顺序
按 CLI 参考,dsh --profile <name> 会启动 $DSH_HOME/profiles/<name>。有效配置按以下顺序叠加到空 root:
- profile 清单
dsh.profile.bundles列出的每个 bundle 的 patch(按 list 顺序) - profile 自身的
cordis.patch.yml - home 层
$DSH_HOME/cordis.patch.yml(机器级偏好跨 profile 共享,所以排在 profile 层之上) - argv 中每个
--patch <path>覆盖
后一层按 row id 整体替换前一层;patch 不深合并单 key。dsh web 是 --profile web 的硬编码别名;argv 之后的参数会被原样交给启动后的 profile 处理(ctx.cmdlineArgs)。
dsh plugin --profile <name> ... 管理 bundle
按 CLI 参考,dsh plugin --profile <name> <args...> 做两件事:
- profile 缺失时先初始化(用发行模板,或对其他名字用
@deepseek-ai/dsh-base起步) - 然后把
<args...>转发给 pnpm,profile 目录作为工作目录
第二点是关键:pnpm 的每个动词都能用 —— add、remove、why、update,以及 pnpm 其他动词。规范动作是:
dsh plugin --profile <name> add @scope/pkg
dsh plugin --profile <name> remove @scope/pkg
dsh plugin --profile <name> update
dsh 不发明自己的子命令表;pnpm 不认识的动词这里也不可用。
两点必须知道的行为细节
按 CLI 参考:
- bundle 成员关系需要重启 profile。 正在跑的 profile 保留当前启动时的 bundle 集合;对 profile 或 home 层
cordis.patch.yml的常规编辑会被事务式热重载,但新增、删除、升级 bundle 仍是启动边界。 - 从 Git 装 TypeScript 源码包会撞上 pnpm ≥10 的
allowBuilds门禁。 Git 装只拉源码、不跑 build 脚本,所以lib/不在;把 pnpm 给的包名加到 profile 的pnpm-workspace.yaml的allowBuilds下再重跑;或者直接发预编译产物到 npm / 用pnpm pack出 tarball。
不实际启动只检视
按 CLI 参考:
dsh --profile web --dump-default-config
dsh --profile web --patch ./extra.yml --dump-config
--dump-default-config 只打印 bundle 层;--dump-config 还会加上 profile 的 cordis.patch.yml、home 层的 patch、--patch 覆盖。两份输出都会按注释标出每行来自哪个文件;!!js 表达式不会被求值;dump 永远不会跑 app 命令行 provider,所以它展示的是 app 参数被解析之前的组合树。
与站内其他位置的关系
- Plugin 101 —— 构建侧姊妹篇:怎么写插件、怎么打成 bundle
- Quick start —— 启动的前置步骤
- What is DeepSeek Harness? —— 架构导读
- What is Cordis? —— 插件扩展的 context 模型
- The map —— 本篇引用的每条插件都索引在那里
- Stats —— 方法论里引用的实时构建期数字