后端与接口
用 CUE 为 grafana-app-sdk 应用编写…
在 grafana-app-sdk 项目中用 CUE 定义 Kind(资源类型)时,指导脚手架、schema 编写、版本注册与代码生成及排错。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 CUE 为 grafana-app-特定
解决思路
- 新增 Kind:运行 `grafana-app-sdk project kind add MyKind --overwrite` 生成 kinds/mykind.cue、kinds/mykind_v1alpha1.cue 并更新 kinds/manifest.cue。
- 编辑生成的 .cue 文件,填写 schema.spec / schema.status 字段。
- 运行 `grafana-app-sdk generate` 生成类型与客户端。
- 验证生成产物:`ls pkg/generated/`,应包含 MyKind 的新类型。
- 若 generate 因 CUE 错误失败:阅读错误信息,CUE 会打印出错文件、行号及失败的约束。
- 常见错误原因:缺少必填字段、类型不匹配(如 string 字段被赋 int)、版本文件之间引用未解析。
- 修复 .cue 源文件后重新运行 `grafana-app-sdk generate`;绝不要编辑 pkg/generated/ 下的文件,它们每次运行都会被覆盖。
- 为已有 Kind 新增版本:`cp kinds/mykind_v1alpha1.cue kinds/mykind_v1.cue`。
- 编辑 kinds/mykind_v1.cue,重命名顶层对象(如 myKindv1)并调整 schema。
- 在 kinds/manifest.cue 中注册新版本,添加 `versions["v1"]: { schema: myKindv1 }` 条目。
- 重新运行 `grafana-app-sdk generate`。
- 验证两个版本都已生成:各版本 Go 类型位于 pkg/generated/<group>/<version>/,`ls pkg/generated/` 应列出两个版本目录(如 v1alpha1/ v1/);可选检查 definitions/ 下的 CRD spec,确认 `spec.versions[]` 中出现两个版本。
- 破坏性变更(删除字段、改变类型、新增必填字段)必须放入新版本,绝不要就地修改稳定版本(v1、v2)。
- Kind 文件结构:CLI 在 kinds/ 下生成扁平布局——manifest.cue(应用清单 + 版本列表声明)、mykind.cue(跨版本公共 Kind 元数据)、mykind_v1alpha1.cue(v1alpha1 schema + codegen 配置);多版本 Kind 的额外版本文件并列放置(mykind_v1.cue 等);Kind 数量很大(10+)时考虑按 Kind 子目录布局,完整 Kind 结构参考见 references/kind-layout.md。
- 公共 Kind 元数据(kinds/mykind.cue):`myKind: { kind: "MyKind" ... }`,kind 为必填的 PascalCase 名称,其他跨版本字段(scope、pluralName、validation、mutation、conversion 等)完整字段参考见 references/kind-layout.md。
- 每版本 schema(kinds/mykind_v1alpha1.cue):`myKindv1alpha1: myKind & { schema: { spec: {...}, status: {...} }, codegen: {...} }`;spec 为用户设置的期望状态,status 为 operator 设置的观测状态。
- 应用清单(kinds/manifest.cue):`App: { appName: "my-app", versions: { "v1alpha1": { schema: myKindv1alpha1 } } }`。
- 代码生成配置:`codegen: { ts: { enabled: true | false }, go: { enabled: true | false } }`;前端专用应用禁用 go 可避免无用的 Go 代码,后端专用资源禁用 ts 可减小打包体积;省略时两者默认均为 true。
- 参考文档:references/kind-layout.md(公共元数据字段 + 应用清单字段 + 按 Kind 子目录布局)、references/schema-types.md(CUE schema 字段类型:基础类型、约束、regex、枚举、map、list + `#` 前缀命名类型定义)、references/custom-routes.md(Kind 级与版本级自定义路由 + app.go 中的 handler 注册)。
适用边界 · 注意事项
- 不适用于非 grafana-app-sdk 项目或不用 CUE 定义资源的场景。
- 不要编辑 pkg/generated/ 下的生成文件,它们每次 generate 都会被覆盖。
- 不要就地修改稳定版本(v1、v2)做破坏性变更,必须新建版本。