You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Go模块生成的CUE Schema结构体字段添加约束

解决Go生成CUE Schema后添加字段约束的问题

方案一:修正Go结构体的CUE标签,让生成的Schema自带约束

你之前在Go struct里写的CUE标签格式错误,导致生成的Schema没带上正则约束。正确的写法是直接给字段指定约束,不需要重复字段名:

type App struct {
    Version string `cue:"=~\"core.myapp.dev/v1\"" yaml:"Version"`
}

重新生成schema.cue后,会得到带约束的结构体定义:

package app

#App: {
  version: string =~"core.myapp.dev/v1" @go(Version)
}

此时执行校验命令,指定用#App作为校验schema:

cue vet schema.cue tests/badVersionValue.yaml -d '#App'

就能正常输出版本值不合法的错误。

方案二:基于生成的Schema扩展约束,并正确触发校验

如果不想修改Go源码,之前的扩展写法本身没问题,但需要让cue vet知道要用扩展后的#AppExtended来校验:

方式1:用-d参数指定校验目标

执行命令时明确指定使用#AppExtended:

cue vet schema.cue tests/badVersionValue.yaml -d '#AppExtended'

方式2:将扩展类型设为顶层约束

修改schema.cue,把#AppExtended放到顶层,这样cue vet会自动用它校验:

package app

#App: {
  version: string @go(Version)
}

#AppExtended: #App & {
  version: =~ "core.myapp.dev/v1"
}

// 顶层引用扩展类型,触发自动校验
#AppExtended

之后直接执行:

cue vet schema.cue tests/badVersionValue.yaml

就能得到预期的错误提示。

为什么之前的扩展没生效?

cue vet默认只会校验顶层的约束定义,如果#AppExtended只是被定义但没有在顶层被引用,命令不会自动用它来校验输入文件,必须显式指定或放到顶层。

内容的提问来源于stack exchange,提问作者dat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:42:20