介绍



CUE 是什么?

CUE 是一门逻辑语言,专门用于处理配置、结构、数据并执行它们。 大多数人开始使用 CUE 是因为要做数据验证和生成配置。 然后他们继续将 CUE 用于数据模板、运行时输入验证、代码生成、脚本、管道等等, 这些我们都将在本教程中进行介绍。

首先你要明白 CUE 并 不是 一种通常意义的程序语言,它是 图灵非完备 的编程语言。

基本理念是,如果把配置和数据编写在一起,人类和机器都更难理解。 可以称为:“用数据封装代码,而不是用代码封装数据”。

CUE 是 JSON 的超集,这意味着你可以用 CUE 来表示任何 JSON:

music.json

{
  "albums": [
    {
      "artist": "Led Zeppelin",
      "album": "BBC Sessions",
      "date": "1997-11-11"
    }
  ]
}

music.cue

albums: [{
	artist: "Led Zeppelin"
	album:  "BBC Sessions"
	date:   "1997-11-11"
}]

JSONSchema 和 JSON 是完全不同的概念,一个定义了结构,另一个是数据,而在 CUE 中,它们将是一样的。 CUE 将 类型(types)数据(values) 合并为同一个概念:

这让我们能在同一个文件中定义结构、进行约束和生成数据,也意味着定义结构对人类思考然后实现它都将变得更容易。

在 CUE 中,类型、数值、约束条件 都是一样的定义。 结构、数据、规则是没有区别的(对于 CUE 来说), 但 CUE 有一个 值的等级结构最高级( “_” )可以代表任何值,而 最低级 ( “_|_” ) 代表 void 空值。

从技术上讲,它是有序集一部分,每个值都有一个唯一的上界以及最大下界。 整个集合从一个根结点 (top, _, any) 开始,到某个叶子结点 (bottom, _|_, void) 结束, 然后所有的值都在它们两个之间,按照一定的顺序。

package hierarchy

import "list"

#Schema: {
	hello: string
	life:  int
	pi:    float
	nums: [...int]
	struct: {...}
}

#Constrained: #Schema & {
	hello: =~"[a-z]+"
	life:  >0
	nums:  list.MaxItems(10)
}

Value: #Constrained & {
	hello: "world"
	life:  42
	pi:    3.14
	nums: [1, 2, 3, 4, 5]
	struct: {
		a: "a"
		b: "b"
	}
}

在上面的代码中,我们有一个"类型" #Schema,一些"约束条件" #Constrained,还有一个"值" Value

带着 ##Definitions: 定义和不带 # 的定义 Values: 在语义上有些区别,我们将会在之后的教程中展开。

CUE 有 package、import、典型的基本类型、list 和 struct。

& 连接两个或更多 CUE 的 “值”(包括类型、约束条件或数值),来确保结果是有效和正确的。 此外,一个操作符 |

#Constrained 定义中,你能发现有正则和逻辑操作符,以及调用了一个内置的标准库。

我们都将在后面进行详细讲解。

CUE 代表 Configure, Unify, Execute

用 CUE 写的代码,并不是给计算机指令。 而是你指定一些东西然后 CUE 告诉你它们是有效还是无效的。 如果现在这个听起来很奇怪,不用担心,它将很快变得明了。

CUE 基于一些 90 年代的 NLP 的技术(早于深度学习),根据图统一算法分析你的代码, 所以你可以在多个目录或者 package 中扩展你的配置,将通用的结构、约束条件、逻辑还有数值组织到可以重用的模块中。

总结:什么是 CUE?

它是你众多编程工具中新的逻辑语言,CUE 可以帮助你管理配置、校验数据、共享结构、生成代码等等。

CUE 非常年轻,它有光明的未来,我个人是在 devops 中首次接触到 CUE。

我希望你加入我们并给社区带来你自己的最佳实践和新的想法。

如何学习 CUE

需要一个文本编辑器并安装命令 cue,如果你还没有安装,请从 GitHub releases 下载最新版本的命令行工具。

除此之外,大部分例子都会用到命令行,所以需要一个特定命令行终端工具,当然如果用 VS Code 也可以。

如果对应章节需要额外的工具,也会给出对应的说明。

从哪里寻求帮助?

有几个选择:

  1. cue help, 命令行内置的帮助
  2. GitHub Discussions (为了持续跟进,请到这里讨论提问)
  3. Cuelang Slack (还有 invite if needed)
  4. Hofstadter 提供关于 CUE 的商业支持和服务
我们绝不会将你的邮箱分享给任何人。
2022 Hofstadter, Inc