##看报错停在哪一层
Stash 的报错可以粗分成两层:YAML 语法层和资源加载层。语法层没过时,后面的 rule-set、provider、策略组命中都不用急着查。
| 报错片段 | 更可能卡点 | 做什么 |
|---|---|---|
unknown anchor | 引用了不存在的锚点 | 找到对应 *name,改成完整字段 |
unknown alias | alias 写法或作用域不被接受 | 删除 *name,把列表展开 |
unknown tag | 配置里有自定义 YAML 标签 | 删除标签,保留标签后的真实值 |
cannot unmarshal | 字段类型不符合预期 | 对照 Stash / Mihomo 配置文档改类型 |
rule-set failed | 外部规则资源失败 | YAML 通过后再单独测 URL |
anchors 到底要怎么展开?
anchors 的本质是“先定义模板,再在别处引用”。桌面端配置里常见写法是把公共节点参数、分组参数或 provider 参数放进 &default,后面再用 *default 复用。
排错时先牺牲文件长度,换取可读性:每个 group 都明确写 type、proxies 或 use,每个 provider 都写完整字段。等 Stash 能保存配置,再考虑要不要保留少量简单复用。
哪 3 个符号优先删?
优先删这 3 类符号:&、*、<<:。
& 是定义锚点,* 是引用锚点,<<: 是合并键。只要其中一处名字拼错、缩进变了,或者解析器不接受合并方式,整份 YAML 就会在进入规则阶段前失败。
从桌面 Clash 迁到 Stash,哪些字段先别带?
先只保留 3 块:proxies、proxy-groups、rules。这 3 块能跑起来,说明基础结构没问题。
script、profile、部分 experimental 字段、复杂 provider 和外部 rule-set 最容易把问题混在一起。迁移第一轮把它们注释掉,第二轮再按一块一个变量加回。
如果同一份配置要给多个客户端共用,最麻烦的不是节点数量,而是不同客户端对 YAML 扩展写法的容忍度不同。多端共用时,用多格式测试订阅源承载基础配置,通常比手写 anchors 再逐端修补更省事。
rule-set 报错要和 anchors 一起修吗?
不要一起修。YAML parser 报错时,rule-set 还没有真正进入下载、解析、命中阶段;这时看到的资源报错很可能只是连带噪音。
做一个最小配置:1 个 DIRECT 分组、1 个节点分组、2 条规则。最小配置能在 Stash 保存并显示策略组后,再把 rule-set 一个一个加回。
Stash 配置解析失败:怎么判断已经修好
看 4 个信号就够了。
- Stash 能保存配置,不再弹 YAML parser 错误。
- 策略组里能看到节点或 provider 展开的节点。
- 日志里不再出现
anchor、alias、unknown tag。 - 刷新规则资源后,剩下的错误只和 URL、404、超时或资源格式有关。
如果第 1 步还没通过,继续删 YAML 扩展写法;如果第 1 步通过但第 4 步失败,再去查 rule-set 地址和资源格式。