如何在单个 json 模式文档中支持多个顶级命名空间?这是用于掌舵子图表
How do I support multiple top level namespaces in a single json schema document? This is for helm sub charts
我知道“命名空间”不是正确的术语,但我很难在 json 架构文档或网上找到解释的这个用例。
我使用 json 模式作为 helm 子图表。在不讨论 helm 细节的情况下,这意味着该模式将用于验证如下所示的 yaml 文档(在子图表自己的项目中):
# values.yaml in mysubchart
propOne:
derp: 123
herp: abc
还有如下所示的 yaml 文档(在父图表项目中):
# values.yaml in mysubchart
mysubchart:
propOne:
derp: 123
herp: abc
所以我有两个文档要使用相同的模式进行验证。唯一的区别是其中一个文档有一个顶级字段,所有内容都嵌套在 (mysubchart:
)
下
是否可以使用相同的 json 架构支持这两个文档? Helm 将毫无问题地使用 helm lint 验证架构,但我也希望用户能够将他们的编辑器指向我发布的 json 架构,以验证父图表中的值 yaml 并获得自动完成等。
编辑
我试过了,但它对任何一个 yaml 文档都无效:
{
"$defs": {
"mychart": {
"$schema": "http://json-schema.org/schema#",
"title": "test",
"description": "test",
"type": "object",
"required": [
"propOne",
"propTwo"
],
"properties": {
"propOne": {
"description": "sdkfjlsdfjlksdjf",
"type": "string"
},
"propTwo": {
"description": "sdkfjlsdfjlksdjf",
"type": "string"
},
}
},
},
"oneOf": [
{
"$ref": "#/$defs/mychart"
},
{
"properties": {
"mychart": {
"$defs": "#/$defs/mychart"
}
}
}
]
}
看起来这适用于验证我的第一个 yaml 文档:
"anyOf": [
{
"$ref": "#/$defs/mychart"
}
]
但是将第二个元素添加到 properties
以尝试验证第二个文档搞砸了,但都没有正确验证
这有效我缺少配置的 required:mysubchart 部分
您可以将多个模式与 oneOf
组合,并将公共元素移动到两个模式引用的定义中:
$defs:
chart:
type: object
required: [ propOne ]
properties:
propOne:
required: [ derp, herp ]
properties:
derp:
type: integer
herp:
type: string
type: object
oneOf:
- $ref: '#/$defs/chart'
- required: [ mysubchart ]
properties:
mysubchart:
$defs: '#/$defs/chart'
如果您使用的实现仅支持 draft7 或更早版本,请将 $defs
更改为 definitions
。
组合模式在 https://json-schema.org/understanding-json-schema/reference/combining.html 中介绍。
我知道“命名空间”不是正确的术语,但我很难在 json 架构文档或网上找到解释的这个用例。
我使用 json 模式作为 helm 子图表。在不讨论 helm 细节的情况下,这意味着该模式将用于验证如下所示的 yaml 文档(在子图表自己的项目中):
# values.yaml in mysubchart
propOne:
derp: 123
herp: abc
还有如下所示的 yaml 文档(在父图表项目中):
# values.yaml in mysubchart
mysubchart:
propOne:
derp: 123
herp: abc
所以我有两个文档要使用相同的模式进行验证。唯一的区别是其中一个文档有一个顶级字段,所有内容都嵌套在 (mysubchart:
)
是否可以使用相同的 json 架构支持这两个文档? Helm 将毫无问题地使用 helm lint 验证架构,但我也希望用户能够将他们的编辑器指向我发布的 json 架构,以验证父图表中的值 yaml 并获得自动完成等。
编辑
我试过了,但它对任何一个 yaml 文档都无效:
{
"$defs": {
"mychart": {
"$schema": "http://json-schema.org/schema#",
"title": "test",
"description": "test",
"type": "object",
"required": [
"propOne",
"propTwo"
],
"properties": {
"propOne": {
"description": "sdkfjlsdfjlksdjf",
"type": "string"
},
"propTwo": {
"description": "sdkfjlsdfjlksdjf",
"type": "string"
},
}
},
},
"oneOf": [
{
"$ref": "#/$defs/mychart"
},
{
"properties": {
"mychart": {
"$defs": "#/$defs/mychart"
}
}
}
]
}
看起来这适用于验证我的第一个 yaml 文档:
"anyOf": [
{
"$ref": "#/$defs/mychart"
}
]
但是将第二个元素添加到 properties
以尝试验证第二个文档搞砸了,但都没有正确验证
这有效我缺少配置的 required:mysubchart 部分
您可以将多个模式与 oneOf
组合,并将公共元素移动到两个模式引用的定义中:
$defs:
chart:
type: object
required: [ propOne ]
properties:
propOne:
required: [ derp, herp ]
properties:
derp:
type: integer
herp:
type: string
type: object
oneOf:
- $ref: '#/$defs/chart'
- required: [ mysubchart ]
properties:
mysubchart:
$defs: '#/$defs/chart'
如果您使用的实现仅支持 draft7 或更早版本,请将 $defs
更改为 definitions
。
组合模式在 https://json-schema.org/understanding-json-schema/reference/combining.html 中介绍。