merge 和列表修饰符的行为。
字段类型
key-force 不经过上表的字段处理,直接替换整个字段。
标量字段
标量字段只接受普通键或key-force。普通键会覆盖值,key-start、key-end 和 key-merge 不会把标量转换成列表或对象。
修改端口.yaml
标量字段 diff.yaml
mixed-port:
无效的标量修饰符.yaml
普通列表
普通列表不去重。key 替换原列表,key-start 插入开头,key-end 追加末尾,key-merge 在原列表后追加。
修改认证列表.yaml
普通列表 diff.yaml
authentication-force,它仍然是合法语法,但会删除原列表,只保留覆写中的项目:
直接替换认证列表.yaml
命名对象列表
proxies 和 proxy-groups 是命名对象列表。项目有非空 name 时,同名项目只保留最后出现的项目,并保留最后项目的位置;没有有效 name 的项目始终保留。
覆盖策略组.yaml
name: PROXY,结果是原策略组被新项目替换,而不是出现两个 PROXY:
命名对象列表 diff.yaml
name 为空、缺失或只包含空格时不会去重:
不参与去重的项目.yaml
rules 的特殊行为
rules 使用列表语法。应用覆写时,原配置中从第一个终端 MATCH,... 开始的规则段会移动到最终位置;覆写文件新增的规则不会再次扫描或移动。
规则列表.yaml
规则列表 diff.yaml
MATCH 仍会被移到最后:
MATCH 不会留在中间.yaml
新增 MATCH 的实际结果 diff.yaml
MATCH,OLD 来自原配置;新增的 MATCH,PROXY 仍按 rules-end 的位置保留。
对象字段
对象字段使用普通键时会递归处理子键。以dns 为例:
修改 DNS 子字段.yaml
dns.enable 和 dns.enhanced-mode,原有的 nameserver 等子字段会保留。
DNS 子字段 diff.yaml
dns-start 或 dns-end 不会生效,因为对象不是列表:
对象上的列表修饰符.yaml
merge
key-merge 的行为取决于字段类型:
- 对普通列表、命名对象列表和
rules:追加数组项。 - 对对象映射:递归合并映射。
- 对普通对象:按字面量键合并,嵌套键不会再次解析修饰符。
- 对标量:忽略。
映射合并
Provider 合并.yaml
proxy-providers 替换,再由 proxy-providers-merge 添加 interval 和 extra。
普通对象合并
DNS 合并.yaml
dns-merge 中的 nameserver 会按字面量字段写入;它不会变成 nameserver-start,也不会把数组自动追加到原列表。
force
key-force 是最高优先级。只要同一字段存在 force 值,其他 start、replace、merge 和 end 操作都不会继续执行。
强制替换 DNS.yaml
强制替换列表 diff.yaml
force 没有字段类型限制;它的错误示范不是语法错误,而是误用后会丢弃整个字段:
误用 force.yaml
dns.enable,原有的 nameserver、fallback 等字段都会被删除。
顶层字段表
下表是 YumeBox 当前识别的顶层字段。字段不在表中时,继续使用未知字段的通用规则。geosite-matcher 通过最终校验时只接受 mph 和 succinct;其他值会在覆写执行后被拒绝。
嵌套字段表
dns
其他对象
未知字段
未知字段不会被拒绝:对象递归、标量覆盖、数组使用key-start 和 key-end。
未知对象字段.yaml
字面量键.yaml
rules+,不会向 rules 列表追加内容。