启动报错与插件加载排查

常见问题更新于 2026-08-17 · 约 6 分钟阅读

启动报错的四类根因#

官方 CLI 参考写明:配置解析、schema 校验、模块解析或插件启动失败时,dsh 会报告错误并以非零状态退出。排查第一步是读完整报错,先判断失败属于哪一类:

  1. 配置解析——cordis.patch.yml 本身写错
  2. schema 校验——某个插件收到的配置不合法
  3. 模块解析——插件代码找不到或没构建
  4. 插件启动——插件 apply 运行时抛错

安装阶段就失败的(网络、Node 版本、构建授权)见安装失败排查,本文只讲装上之后的启动加载问题。

GitHub 插件缺少构建产物#

git 安装拉取的是源码而非构建产物:如果作者没有提供自包含的 prepare 脚本,TypeScript 包到手时没有 lib/ 输出,启动加载会以模块解析错误失败。先确认已按安装失败排查把包键加入 profile 的 pnpm-workspace.yaml allowBuilds 并重新安装;授权细节见插件配置与版本锁定

授权后仍然失败,多半是作者侧缺少构建脚本,用户侧无解,可改用两种预构建分发形式之一,它们不需要任何构建授权:

  • npm 发布版:dsh plugin add <包名>
  • tarball:dsh plugin add ./xxx-0.1.0.tgz

或者带着报错向作者反馈,渠道见反馈与社区渠道

配置校验失败#

插件加载时会用其导出的 schema 校验配置,配置不合法会加载失败并给出明确错误信息,报错通常指明哪个字段出了问题。错误来自自己 profile 的 cordis.patch.yml 就直接修;错误指向组合包贡献的行,不要改包本身,在自己的 patch 层覆盖该行。

插件静默不加载#

不是所有加载问题都有报错。如果插件的 inject 声明了无人提供的服务,它会一直停在 PENDING 等待,不输出任何内容——这是合法状态,提供方可能稍后才挂载。插件"装了但不见效"时按顺序检查:

  • 插件行是否被标记了 disabled: true
  • 安装时是否出现过一次性警告:没有 dsh.bundle 声明的包只作为普通依赖保留,不激活任何配置层
  • 用官方教程的诊断脚本枚举 fiber 状态,找出停在 PENDING 的插件

诊断脚本来自官方 Cordis 教程,加载后 500ms 打印所有等待依赖的插件:

import { FiberState, type Context } from '@deepseek-ai/cordis'

export const name = 'diagnose'

export function apply(ctx: Context) {
  setTimeout(() => {
    for (const runtime of ctx.registry.values()) {
      for (const fiber of runtime.fibers) {
        if (fiber.state === FiberState.PENDING) {
          console.log(`${fiber.name} is PENDING — a required service is missing`)
        }
      }
    }
  }, 500)
}

用 dump-config 看生效配置#

怀疑某行配置来路不明时,先让 dsh 打印组合后的完整配置树:

dsh --profile <name> --dump-config

输出会注明每行来自哪个文件、被哪些 overlay 修改过;找不到目标的 patch 会报告到 stderr。profile 与 home 两级 cordis.patch.yml 的修改在运行中会被监视并事务式重新应用,改配置不需要重启。

插件自身代码出错#

报错栈指向插件包内部(apply 抛异常)时,问题大概率在上游:最近的推送引入了 bug。回退到上一个确认可用的提交验证:

dsh plugin add github:<owner>/<name>#<commit-sha>

版本锁定用法见插件的安装、更新与卸载。确认是上游 bug 就去仓库提 issue,附上完整报错与所锁定的提交,渠道见反馈与社区渠道

快速恢复启动#

只想先恢复可用时,移除问题插件,其依赖与配置层会一并删除:

dsh plugin --profile <name> remove <包名>

移除前建议先 --dump-config 记下该插件贡献的配置行,事后按需补回。

本文依据官方 CLI 参考与发布教程整理,命令行为以上游文档为准。