一个值换行了就报错?YAML 的续行要写成 > 或 |
校验器提示「一个键的内容换行了,但没有用正确的续行写法」,多半是长字符串被编辑器自动折行、或者从网页复制时带进了换行。本文说明 YAML 里值换行的三种合法写法,以及它们的区别与选择。
本文目录(7 节 · 约 2 分钟) +
一句话结论:YAML 里一个值默认必须待在一行内。要跨行,得显式写成块状标量 key: | 或 key: >,否则第二行会被当成新的一条语法来解析,于是报错。
报错长什么样
一个键的内容换行了,但没有用正确的续行写法
值如果要换行,要么写成
key: >或key: |的块状写法,要么保持在一行内。
为什么会无意中换行
编辑器自动折行看起来像换行,其实不是。 这种情况不会报错——软折行只是显示效果,文件里仍是一行。看到报错说明文件里真的有换行符。
从网页复制时带进了换行。 教程页面为了排版,会把长字符串(Reality 公钥、gRPC 的 serviceName、很长的路径)折成两行显示。复制的时候那个换行符会跟着进来。
手动排版时按了回车。 觉得一行太长不好看,就在中间敲了个回车——YAML 不接受这种。
三种合法写法
假设有一个很长的值:
保持在一行(最简单,推荐):
ws-opts:
path: /a/very/long/path/that/looks/uncomfortable/but/is/fine
行长本身不是问题。YAML 没有行宽限制,客户端也不在乎。
折叠块 >:换行会被折叠成空格。
description: >
这一行和
下一行会被合并成一行,中间用空格连接。
结果是 这一行和 下一行会被合并成一行,中间用空格连接。
保留块 |:换行原样保留。
description: |
第一行
第二行
结果里真的有一个换行符。
在 Clash 配置里该用哪个
基本上哪个都不该用。 Clash 配置里的字段——路径、域名、UUID、公钥——都是不应该含空格或换行的单值。真正需要块状标量的场景在 Clash 配置里很少见。
所以遇到这条报错,正确动作通常不是「改成 | 写法」,而是把误入的换行删掉,让值回到一行。
判断依据很简单:这个值本来就该是一个连续的字符串吗?路径、密钥、域名都是。那就删换行。
一个高频具体场景
Reality 的公钥很长,是最容易被折断的字段:
# 错的:从网页复制时断成了两行
reality-opts:
public-key: 3Yx8kQvN2mPz
LbR7wT5aHfCg
# 对的:接回一行
reality-opts:
public-key: 3Yx8kQvN2mPzLbR7wT5aHfCg
断掉的公钥即便侥幸没报语法错误,握手也一定失败——它是逐字符校验的。把节点链接粘进节点链接解析器可以看到公钥的原始完整值,照着补回去比手工拼接可靠。
怎么快速定位
这类换行在编辑器里几乎看不出来,因为软折行和硬换行长得一样。把配置粘进配置校验器,它会标出出错的行号并跳过去——比肉眼扫快得多。
相关
相关文章
Clash 报错「proxies 必须是数组」是什么意思,怎么改
Clash 或 mihomo 提示 proxies 不是数组、无法解析节点列表时,问题几乎都出在 YAML 的短横线和缩进上。本文说明这个报错的确切含义、四种常见成因,以及每种情况的正确写法。
YAML 缩进明明对齐了却报错?多半是 Tab 混进来了
Clash 配置提示缩进不一致、mapping items 未对齐,但肉眼看每一行都对得整整齐齐——这种情况几乎都是 Tab 和空格混用。本文说明 YAML 为什么禁止 Tab 缩进、怎么在编辑器里揪出它,以及另外两种视觉上看不出的缩进问题。
报「配置最外层不对」——多半是你只粘了一段
校验器提示「配置最外层应该是 proxies / proxy-groups / rules 这样的键,而不是数组或纯文本」,通常不是配置坏了,而是你粘进来的只是整份配置里的一小段。本文说明 Clash 配置的顶层结构长什么样,以及三种典型的粘错情况。