Repository navigation
[实战复盘] 深度定制 DSH Profile 升级全链路避坑与工程实践(以 0.2.1-rc.2 → 0.2.1-rc.5 为例) #12151
Unanswered
superwiboy
asked this question in
Q&A
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
[实战复盘] 深度定制 DSH Profile 升级全链路踩坑与最佳实践(以 0.2.1-rc.2 → 0.2.1-rc.5 为例)
摘要
DeepSeek Harness(DSH)采用「一切皆插件」与 Profile 架构。出厂空白 Profile 升级通常顺利,但一旦 Profile 经过深度定制(包含多个第三方插件、本地 hotfix、历史依赖 overrides 和复杂
cordis.patch.yml),升级就极易遭遇:disabling profile plugin row或did not activate(混合树断裂);pnpm install后被静默冲掉;dsh-app-boot静默跳过(skipping profile bundle);start-limit-hit熔断。本文基于一次生产环境从
0.2.1-rc.2成功平滑跃迁至0.2.1-rc.5的实战经验,系统拆解 7 个关键陷阱,并提供一套可复现、带秒级回滚与硬闸门校验的工业级升级标准规程。一、环境拓扑与背景
@deepseek-ai/dsh) + Profile 目录 (~/.dsh/profiles/<profile_name>)0.2.1-rc.2升级至0.2.1-rc.5pnpm-workspace.yaml中配置了多条@deepseek-ai/*的版本锁定二、关键陷阱与深层机理剖析
坑 1:
pnpm-workspace.yaml历史 overrides 锁死子包引发「混合树断裂」若仅在
package.json或通过pnpm add升级顶层几个核心包,启动时 journal 会报 20+ 甚至 50+ 行disabling profile plugin row,必需核心插件(如agent-loop、webserver)彻底无法激活。此前为解决深层 npm 依赖 hoisting 冲突,在
pnpm-workspace.yaml的overrides:中钉死了大量0.2.1-rc.2。如果只升级顶层包,深层依赖仍被强制解析为 rc.2,导致整棵 node_modules 形成版本割裂的“混合树”。rc.5 的顶层服务无法在 rc.2 的深层环境下握手。必须将
pnpm-workspace.yaml中的 overrides 版本批量同步替换为目标版本。坑 2:旧 Lockfile 导致未覆盖子包滞留(必须清锁重装)
即使修改了 overrides 并执行
pnpm add,启动后仍有个别插件报丢失服务。未在 overrides 清单中的间接传递依赖(例如
@deepseek-ai/dsh-client-ui-primitives、@deepseek-ai/dsh-client-ui-slots等),会被旧的pnpm-lock.yaml自动命中并锁定在旧版。修改 overrides 后,必须彻底删除
node_modules与pnpm-lock.yaml,触发全树依赖基于新 overrides 重新解析解析,并在升级后执行硬校验:确保node_modules/@deepseek-ai/*下旧版本包残留计数严格为 0。坑 3:CLI 与 Profile 强同源约束及命令行参数变更
startup failed: 2 required plugins did not activate。web子命令,报error: too many arguments. Expected 0 arguments but got 1: web。--profile <name>时,不应再传web位置参数,直接使用dsh --profile <name> --port <port> --no-open即可。坑 4:
pnpm install会静默冲掉手工改动(必须资产化为pnpm patch)生产依赖重装后,某个第三方插件突然报
SyntaxError: The requested module '@deepseek-ai/dsh-llm' does not provide an export named 'assertNever'。第三方插件跟进官方发版较慢,用户此前在
node_modules/下手工修改了源码适配;但pnpm install会无条件整包还原为 npm 上游代码,导致本地修复静默丢失。所有本地修补必须使用
pnpm patch <package>固化到 Profile 根目录的patches/目录,并在pnpm-workspace.yaml中配置patchedDependencies。每次 install 后校验目标文件的 sha256。坑 5:
compatibility.json精准追加版本豁免启动日志出现
dsh: skipping profile bundle "xxx",插件卡片或功能消失,但没有任何报错堆栈。查阅
dsh-app-boot/lib/index.js,DSH 对第三方 bundle 有运行时版本兼容性校验。如果该插件的package.json中的 peerDependencies 只声明支持旧版范围,DSH 会直接跳过加载。必须在 profile 目录下的
compatibility.json中,向对应插件追加新版本(如"0.2.1-rc.5"),使dsh-app-boot放行加载。坑 6:外部看门狗 Timer 抢拉中间态与 systemd 熔断
升级过程中,服务突然在一瞬间产生 100+ 条
disabling profile plugin row报错,随后执行systemctl start报start-limit-hit拒绝启动,自动回滚也随之失败。watchdog.timer,在 profile 依赖已换新但 CLI 尚未升级的几秒真空期内,看门狗整点唤醒并拉起服务,导致反向混合树崩溃连炸;StartLimitIntervalSec=300 / Burst=5保护阈值,直接锁死 service 单元。systemctl start之前及回滚逻辑中,必须强制前置执行systemctl --user reset-failed <service>清除熔断标记。坑 7:Web Token 异步输出延迟
升级脚本探测到 HTTP 200 后立即 grep journal 提取登录 token,报错“找不到 token”误判失败。
底层的
/api/dsh-mneme/health在 9 秒内返回 200,但 Webserver、插件与认证机制完整就绪并向日志打印dsh web: http://.../?token=...通常需要 15~25 秒。采用最长 60 秒的轮询等待循环提取 token,杜绝时序差误判。
三、标准化生产迁移规程(脱敏脚本模板)
推荐采用「秒级硬链接快照 + 闸门前置 + 全自动回滚」的设计模式:
四、经验总结
node_modules,善用pnpm patch让每一次修复都有迹可循;希望这份实战记录能为社区中正在遇到升级报错的开发者提供参考!
All reactions