Skip to content

排障 ​

返回总览

这一页按常见症状组织,不按模块组织

步骤没有出现 ​

优先检查四件事

  1. initialValues 是否已经让该步骤被跳过
  2. when 是否返回了 false
  3. 是否存在更早命中的同名步骤
  4. 是否从 checkpoint 恢复后把该步骤标记为已完成

select 或 autocomplete 的 initialValues 报错 ​

这类错误通常意味着预填值不在 options 范围内

处理方式很直接

  • 校对 initialValues
  • 校对 options 的 value 类型
  • 如果值来自 CLI,检查 parse 是否把字符串转成了预期类型

history 没有生效 ​

先检查这几项

  1. createWorkflowKit 是否开启了 history
  2. 本次 run 是否把 history 显式关掉了
  3. workflow 是否成功运行到保存快照阶段
  4. 是否已经传入 initialValues 且没有显式要求 reuse

最后一种情况最容易误判,因为运行时会优先尊重本次外部传值

checkpoint 没有恢复 ​

优先检查

  1. createWorkflowKit 是否开启了 checkpoints
  2. 上次运行是否在失败或取消时留下 checkpoint
  3. 本次 checkpoint.resume 是否为 never
  4. 本次是否传入 initialValues 且没有显式要求恢复

成功完成的 workflow 会自动清理 checkpoint,这不是丢失,而是预期行为

日志没有落盘 ​

优先检查

  1. createWorkflowKit 是否开启了 logs
  2. 本次 run 的 logs.enabled 是否被关掉
  3. workflow.log.completion 是否配置为 false
  4. 保存目录是否可写

如果只是想临时保存,也可以直接调用 result.saveLog()

命令输出看不到 ​

通常是 renderer 选择问题

  • task-log 只展示结构化输出与保留日志
  • quiet 不实时展开 stdout 和 stderr
  • renderer=inherit 会把输出写回当前终端

如果是 docker build、交互式进度条或依赖真实 TTY 的命令,还要再配 tty: 'passthrough'

设置 tty: 'passthrough' 后,这次命令会自动按 renderer=inherit 的语义处理,所以通常不用再额外写一遍 renderer

先确认 command 步骤的 renderer 配置,再确认是否真的往 io.stdout 或 io.stderr 写了内容

像 git clone --progress 这类命令会把进度写到 stderr,这不代表失败 clack-kit 会在执行结果里保留原始 stdout 和 stderr,但 live task-log 会按可见日志展示它们

CLI 参数没有映射到步骤 ​

依次检查

  1. createWorkflowCliBridge 是否接收了正确的 steps
  2. bridge.apply(cli) 是否执行了
  3. bridge.getInitialValues(parsed.options) 是否传给了 run
  4. 字段是否被 optionKey 或 parse 改名、改形

workflow 在取消时抛错 ​

这是 run 和 runSafely 的行为差异

  • run 在取消时抛错
  • runSafely 在取消时返回 null

需要安静处理取消时,优先选 runSafely

相对路径解析不对 ​

相对路径默认基于 projectRoot 解析,而 createWorkflowKit 用来设置它的字段现在叫 cwd

检查点包括

  • createWorkflowKit 的 cwd
  • command 的 cwd
  • scriptFile 是否以项目根目录为基准书写

下一步建议 ​