profile 是叠加出来的,不是配出来的
2026-10-02 · 9 分钟阅读
第一次改 DSH 配置改不动的时候,我以为是插件没加载。后来才想明白:问题不在插件,在我没搞清楚配置是怎么叠起来的。
配置树从一个空根开始
DSH 的配置不是「一份文件」,而是从空根开始依次叠加的若干层。顺序是这样的:
dsh.profile.bundles里各组合包带的 patch- profile 自己的
cordis.patch.yml - home 级的
$DSH_HOME/cordis.patch.yml --patch指定的覆盖层
越靠后优先级越高。这解释了一个常见现象:你在 profile 里改了一个字段,重启后没变化——因为 home 级那层把它盖掉了。
package.json(记录树外插件依赖 + dsh.profile manifest),加一个 cordis.patch.yml(用户自己的 patch)。调配置之前先 dump,别猜
与其逐层推演,不如直接看组合后的结果。三个命令各有用处:
dsh --profile web --dump-config # 组合后的最终配置树
dsh --profile web --dump-default-config # 没叠加用户 patch 的默认值
dsh --profile web --dump-config-schema # 插件声明的 JSON Schema
--dump-config 和 --dump-default-config 一比,就知道差异是「我改的」还是「插件默认的」。--dump-config-schema 输出的是描述 entry 与 patch 的 JSON Schema,不是配置值——它会在不启动应用的情况下导入组合树里插件声明的 schema。
如果你要 dump 不受信任的第三方插件,先读一下 schema dump 的安全性与范围说明,这个命令会实际导入插件代码。
两个容易踩的地方
desktop 这个名字不能碰
desktop 保留给 Electron 持有的 profile。CLI 会直接拒绝对它的启动和配置 dump 请求——不是权限问题,是设计如此。想建自定义 profile 换个名字。
HMR 开着和关着,行为不一样
启用 dsh-hmr 时,它会监视 profile manifest、profile 与 home 级 patch 文件,通过统一串行重载重新组合所有层。没启用的话,改动要重启才生效。
这里有个细节值得知道:监听器注册期间发生的编辑会被当作后续编辑处理,走同样的非致命重载错误报告路径。所以「改配置的那一刻正好在启动」不会导致状态错乱。
插件装到哪
dsh.profile.bundles 里列出的组合包,先从 dsh 安装目录解析(dsh-base、dsh-web-app 这些),再从 profile 自己的 node_modules 解析。pnpm 会把树外插件装进后者。
用 dsh plugin --profile <name> <pnpm 参数> 管理依赖,它会转发给 pnpm 并持有 profile 写锁——所以它和插件管理器不会打架。更新依赖时会保留已停用的组合包选择,不会把你之前关掉的插件又打开。
小结
理解分层顺序的价值不在于背下来,而在于知道「改配置没生效」时该去 dump 哪一层。顺序记不住没关系,命令记住就行。