如何在单个 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 中介绍。