Skip to main content

1 post tagged with "Release Blog"

查看所有标签

· 阅读需要 1 分钟

简介

KCL 团队很高兴地宣布 KCL v0.4.6 新版本现在已经可用!本次发布为大家带来了三方面的重点更新:语言工具链社区集成 & 扩展支持

  • 使用 IDE 插件提升 KCL 代码编写体验和效率
  • Helm/Kustomize/KPT 云原生社区工具集成
  • 完善 KCL 多语言 SDK,方便应用程序集成

进一步您可以在 KCL v0.4.6 发布页面 或者 KCL 官方网站 获得下载安装指南和详细发布信息。

KCL 是一个开源的基于约束的记录及函数语言,期望通过成熟的编程语言技术和实践来改进对大量繁杂配置和策略的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更快的自动化集成和良好的生态延展性。

本文重点介绍 KCL v0.4.6 版本的更新内容以及 KCL 社区的近期动态。

语言更新

内置函数更新

KCL 字符串新增 removeprefixremovesuffix 成员函数用于去除字符串的前缀和后缀子字符串

data1 = "prefix-string".removeprefix("prefix-") # "string"
data2 = "string-suffix".removesuffix("-suffix") # "string"

更多使用方式 详见

编译器提示信息改进

在之前的 KCL 版本中,运行一次 KCL 命令行工具只会显示一个错误信息与警告,在 KCL v0.4.6 版本中,支持了一次编译显示多个错误与警告的能力并改善了错误提示信息,用于提升 KCL 代码错误排查效率,比如对于如下 KCL 代码 (main.k)

metadata = {
labels = {key = "kcl
}

执行如下 KCL 命令行,可以看到会同时提示字符串编写错误和花括号未正确匹配错误的语法错误信息

$ kcl main.k
error[E1001]: InvalidSyntax
--> main.k:2:21
|
2 | labels = {key = "kcl
| ^ unterminated string
|

error[E1001]: InvalidSyntax
--> main.k:2:24
|
2 | labels = {key = "kcl
| ^ expected "}"
|

顶级 schema 语句合并运算符

在之前的 KCL 版本中,在编写如下 KCL 代码时,会将两个 schema 配置进行合并后输出,在 KCL v0.4.6 版本中,要求显式使用属性合并运算符而不是属性覆盖运算符

  • 更新前
schema Config:
id?: int
value?: str

config = Config {
id = 1
}
config = Config {
value = "value"
}
  • 更新后
schema Config:
id?: int
value?: str

# Use the union operator `:` instead of the override operator
config: Config {
id = 1
}
# Use the union operator `:` instead of the override operator
config: Config {
value = "value"
}

路径选择器参数简化

我们使用 path selector CLI 参数 (-S) 不必再填入包路径,并且可以直接筛选内部变量

对于如下的 KCL 代码 (main.k):

schema Person:
name: str
age: int

person = Person {
name = "Alice"
age = 18
}

我们可以执行如下命令

$ kcl main.k -S person
name: Alice
age: 18

错误修复

单行条件配置块语法解析错误

在之前的 KCL 版本中,在编写如下 KCL 代码时会出现非预期的语法错误,在 KCL v0.4.6 版本中,我们修复了此类类似的问题

env = "prod"
config = {if env == "prod": labels = {"kubernetes.io/env" = env}}

Schema 必选属性检查

在之前的 KCL 版本中,在编写如下 KCL 代码时,没有按预期提示 versions 属性没有赋值的错误,在 KCL v0.4.6 版本中,我们修复了此类类似的问题

schema App:
data?: [int]
version: Version

schema Version:
versions: [str]

app = App {
version = Version {}
}

工具链更新

KCL VS Code 插件

在此次更新中,我们发布了全新的 KCL VS Code 插件和使用 Rust 语言重写的语言服务服务器,相比于之前 KCL 版本性能约提升 20 倍,并支持了 KCL 错误警告在 IDE 中实时显示,以及 KCL 代码补全等新功能。

  • 错误与告警实时显示

Diagnostics

  • 跳转

Goto Definition

  • 补全

Completion

  • 悬停

Hover

更多 KCL VS Code 插件安装方式及详细更新内容详见

包管理工具

在 KCL v0.4.6 新版本中,我们提供了全新的 KCL 包管理工具 alpha 版本,用户可以通过几个命令即可获得社区中已经编写好的 KCL 模型。比如可以通过包管理工具一键导入 KCL Kubernetes 模型并使用

kpm init kubernetes_demo && kpm add -git https://github.com/awesome-kusion/konfig.git -tag v0.0.1

编写 KCL 代码 (main.k)

import konfig.base.pkg.kusion_kubernetes.api.apps.v1 as apps

apps.Deployment {
metadata.name = "nginx-deployment"
spec = {
replicas = 3
selector.matchLabels.app = "nginx"
template.metadata.labels = selector.matchLabels
template.spec.containers = [
{
name = selector.matchLabels.app
image = "nginx:1.14.2"
ports = [
{containerPort = 80}
]
}
]
}
}

执行如下 KCL 命令即可获得一个 Nginx Deployment YAML 输出

$ kpm run
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: "nginx:1.14.2"
name: nginx
ports:
- containerPort: 80
  • 更多 Konfig 模型库的内容和使用方式详见

社区集成 & 扩展更新

Kubernetes 配置管理工具扩展支持

在 KCL v0.4.6 中,我们以统一的编程界面方式为 Kubernetes 社区的 Helm, Kustomize, KPT 等配置管理工具提供了插件支持,编写几行 KCL 代码即可无侵入地完成对存量 Kustomize YAML,Helm Charts 的编辑和校验,比如编写少量 KCL 代码修改资源标签/注解, 注入 sidecar 容器配置,使用 KCL schema 校验资源等。

下面以 Kustomize 工具对 KCL 的集成为例进行详细说明。使用 Kustomize KCL 插件无需安装任何与 KCL 相关的二进制,仅需您本地安装有 Kustomize 工具即可。

首先执行如下命令获取一个 Kustomize YAML 配置示例:

git clone https://github.com/kcl-lang/kustomize-kcl.git &&cd ./kustomize-kcl/examples/set-annotation/

然后执行如下命令使用 KCL 代码仅为所有的 Deployment 资源添加一个 managed-by=kustomize-kcl 注解

sudo kustomize fn run ./local-resource/ --as-current-user --dry-run

可以得到如下 YAML 输出:

apiVersion: v1
kind: Service
metadata:
name: test
annotations:
config.kubernetes.io/path: example-use.yaml
internal.config.kubernetes.io/path: example-use.yaml
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
annotations:
config.kubernetes.io/path: example-use.yaml
internal.config.kubernetes.io/path: example-use.yaml
# This annotation is added through the kcl code.
managed-by: kustomize-kcl
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

在上述 YAML 配置中,我们仅编写了一行 KCL 代码就完成为 Deployment 资源添加一个 managed-by=kustomize-kcl 注解

[resource | {if resource.kind == "Deployment": metadata.annotations: {"managed-by" = "kcl"}} for resource in option("resource_list").item]

此外我们为 Kustomize/Helm/KPT 三个工具均提供了常用的容器、服务配置修改校验 KCL 模型,并且会持续完善,欢迎社区小伙伴一起参与共建。

  • 更多 Kustomize KCL 插件详细内容以及用例 详见
  • 更多 Helm KCL 插件详细内容以及用例 详见
  • 更多 KPT KCL 插件详细内容以及用例 详见

多语言 SDK

在此次更新中,我们发布了全新的 KCL Go SDK 将 KCL 集成到您的 Go 应用程序中,并提供丰富的 API 与 KCL 进行交互。您可以在 这里 查询详细的 API 文档。此外我们还更新了如下特性和错误修复:

  • 感谢 @jakezhu9 修复了 kcl-go 未预期的 KCL 格式化 API 在 CI Pipeline 中单元测试错误
  • 感谢 @Ekko 贡献 Go struct 和 KCL schema 双向转换支持,详见:
  • KCL schema 到 protobuf message 的转换支持,详见
  • KCL 新增获取 schema 类型和实例 API,详见

其他更新与错误修复

  • KCL python plugin 功能默认不开启,如需开启可参考 KCL Plugin 文档
  • KCL playground 支持代码分享能力,您可以通过访问 KCL 官网 并点击 Playground 按钮进行体验
  • 更多更新与错误修复,详见

文档更新

KCL 网站 新增 KCL v0.4.6 文档内容并支持版本化语义选项,目前支持 v0.4.3, v0.4.4, v0.4.5 和 v0.4.6 版本选择。同时欢迎社区同学进行文档共建。

下一步计划

预计 2023 年年中,我们将发布 KCL v0.5.0 版本,预期重点演进包括:

  • 更多针对场景问题的 KCL 语言编写便利性改进,用户界面持续优化与体验提升,用户支持和痛点解决
  • 更多 IDE 插件、包管理工具、Helm/Kustomize/KPT 场景集成、功能支持和用户体验提升
  • 针对云原生场景提供更多开箱即用的 KCL 模型支持,主要包含容器、服务、计算、存储和网络等
  • 支持 KCL Schema 直接生成 Kubernetes CRD
  • 支持 kubectl 和 helmfile KCL plugin,通过 KCL 代码直接生成、编辑和校验 Kubernetes 原生资源
  • 支持在 Kubernetes 运行时通过 Admission Controller 运行 KCL 代码对 YAML 进行编辑和校验
  • 更多非 Kubernetes 场景支持,如通过 KCL Schema 对 AI 模型进行数据清理和数据库 Schema 集成支持

更多详情请参考 KCL v0.5.0 Milestone

如果您有更多的想法和需求,欢迎在 KCL Github 仓库发起 Issues,也欢迎加入我们的社区进行交流 🙌 🙌 🙌

常见问题及解答

详见 KCL 常见问题

其他资源

感谢所有 KCL 用户和社区小伙伴在此次版本更新过程中提出的宝贵反馈与建议。受限于文章篇幅,后续我们会撰写更多 KCL v0.4.6 新版本功能解读系列文章,敬请期待!

更多其他资源请参考:

欢迎加入我们的社区进行交流 👏👏👏:https://github.com/kcl-lang/community

· 阅读需要 1 分钟

简介

KCL 团队很高兴地宣布 KCL v0.4.5 版本现在已经可用!本次发布主要为 KCL 语言编写便利性和稳定性提升,错误信息改进以及更多平台包括 windows 版本支持以及更多下载方式支持。在 KCL v0.4.5 版本中,用户可以通过编写更少的 KCL 代码消除更多的配置模版;在新版本中提供了初步的 KCL Playground 支持可用于在线免安装编写并运行 KCL 代码;此外此次更新还包含多项编译器报错信息优化和错误修复。

您可以在 KCL v0.4.5 发布页面 或者 KCL 官方网站 获得 KCL 二进制下载链接和更多详细发布信息。

KCL 是一个开源的基于约束的记录及函数语言,期望通过成熟的编程语言技术和实践来改进对大量繁杂配置和策略的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更快的自动化集成和良好的生态延展性。

本文将会介绍 KCL v0.4.5 版本的更新内容以及 KCL 社区的近期动态。

语言更新

KCL 语言编写便利性改进

支持 Schema 非空属性惰性校验

在之前的 KCL 版本中,我们已经支持了 schema 属性互相引用(包含继承)以及 check 校验表达式的惰性求值与校验能力,在此次版本更新中,我们支持了更多的 schema 惰性求值能力: Schema 属性非空惰性校验。比如对于下述的 KCL 的代码:

schema Spec:
id: int
value: str

schema Config:
name?: str
spec: Spec = Spec {
id = 1
} # 在 KCL v0.4.5 版本之前,这个语句会报属性非空错误,v0.4.5 版本之后,支持 Schema 非空属性惰性校验能力

config = Config {
spec.value = "value"
}

在 v0.4.5 之前的 KCL 版本中,直接执行上述代码会在 schema Config 语句块的 spec: Spec = Spec { 处抛出一个 specvalue 属性不能为空的错误,因为在该处只对 specid 属性赋值为 1,而没有对 specvalue 属性赋值。

在 KCL 的 v0.4.5 版本更新后,我们支持了 schema 属性的惰性非空校验能力之后会避免这个错误的抛出,即当在 config 属性的 spec.value = "value"spec.id = 1 合并之后才会递归地对 config 的所有属性进行非空检查,此时 spec 属性的所有值是被完整赋值的 (specid 字段的值为 1, value 字段为 "value",),不会抛出必选属性字段为空错误。

因此在 v0.4.5 版本之后,执行上述 KCL 代码,我们会得到如下所示的完整 YAML 输出:

config:
spec:
id: 1
value: value

支持配置块属性互相引用以消除更多的配置模版

在 v0.4.5 之前的版本中,KCL 尚未支持配置块内部的属性互相引用,导致在某些场景中会需要定义额外的配置变量或者模版来进行引用,会产生较多的配置模版和重复代码,比如对于如下所示的 KCL 代码:

name = "app-name"
data = {
name = name
metadata.name = name # `metadata.name` 不能直接引用 `data` 内部的 `name` 属性
}

data 配置块的 metadata.name 属性不能直接引用 data 内部的 name 属性,需要额外定义一个全局变量 name 进行引用。

而在 KCL 的 v0.4.5 版本更新后,我们支持了配置块属性互相引用的特性,可以用于消除更多的配置模版,比如如下所示的 KCL 代码:

data = {
name = "app-name"
metadata.name = name # 直接引用 `data` 配置的 name 属性
}

data 配置块的 metadata.name 属性可以直接引用 data 内部的 name 属性而无需定义额外的全局变量。

执行上述 KCL 代码可以获得如下 YAML 输出:

data:
name: app-name
metadata:
name: app-name

下面是一个更复杂的例子

name = "global-name"
metadata = {
name = "metadata-name"
labels = {
"app.kubernetes.io/name" = name # 直接引用 `metadata.name`
"app.kubernetes.io/instance" = name # 直接引用 `metadata.name`
}
}
data = {
name = name # 引用全局的 `name` 变量
metadata = metadata # 引用全局的 `metadata` 变量
spec.template.metadata.name = metadata.name # 引用 `data` 内部的 `metadata` 变量
}

执行上述代码可以获得如下 YAML 输出:

name: global-name
metadata:
name: metadata-name
labels:
app.kubernetes.io/name: metadata-name
app.kubernetes.io/instance: metadata-name
data:
name: global-name
metadata:
name: metadata-name
labels:
app.kubernetes.io/name: metadata-name
app.kubernetes.io/instance: metadata-name
spec:
template:
metadata:
name: metadata-name

⚠️ 注意:当前 KCL 版本尚未支持配置块内部属性后向引用以及跳过内部作用域直接引用全局变量,需要将被引用的属性书写在配置引用处的前方

KCL 语言新增功能

字符串 format 成员函数支持索引格式化

在 KCL v0.4.5 版本更新后,KCL 支持了类似 Python 字符串 format 成员函数在 {} 格式化块中使用 <format_ele_index>[<index_or_key>] 索引标记样式对列表和字典类型的 KCL 变量进行格式化。其中

  • <format_ele_index> 表示需要需要序列化列表和字典类型元素的索引
  • <index_or_key> 表示对应列表和字典类型元素的列表子元素索引或者字典子元素键值

比如对于如下的 KCL 代码

# 0[0] 表示取 ["Hello", "World"] 的第 0 个元素:"Hello"
# 0[1] 表示取 ["Hello", "World"] 的第 1 个元素:"World"
listIndexFormat = "{0[0]}{0[1]}".format(["Hello", "World"])
# 0[0] 表示取 ["0", "1"] 的第 0 个元素:"1"
# 1[Hello] 表示取 {"Hello": "World"} 键值为 Hello 的字典元素:"World"
dictIndexFormat = "0{0[0]}, 1{0[1]}, Hello{1[Hello]}".format(["0", "1"], {"Hello": "World"})

执行上述代码可以获得如下 YAML 输出:

listIndexFormat: HelloWorld
dictIndexFormat: "00, 11, HelloWorld"

KCL 语言 Playground 更新

在此次更新中,我们更新了 KCL Playground 的版本并支持 KCL 代码自动编译和格式化两项能力,您可以通过访问 KCL 官网 并点击 Playground 按钮进行体验。

在后续 KCL 版本中,我们会持续更新 KCL Playground 更多能力支持如 KCL 版本选择与代码分享等功能。

KCL 更多平台和更多下载方式支持

Windows 版本支持

KCL Windows 二进制版本可以从 Github 手动下载并安装,下载完成后将 {install-location}\kclvm\bin 添加到环境变量 PATH 中。

$env:PATH += ";{install-location}\kclvm\bin;"

此外,还可以通过如下所示的 Powershell 脚本进行安装:

powershell -Command "iwr -useb https://kcl-lang.io/script/install.ps1 | iex"

我们后续会支持更多的 Windows 包管理下载方式,如 Scoop 等。

更多下载方式支持

在此次版本更新中,我们支持了更多的 KCL 下载方式,包括脚本, Python, Go, Homebrew 和 Docker 一键安装,更多详细内容请参考 KCL 下载与安装,后续我们会支持更多 KCL 安装方式。

⚠️ 注意:对于上述所有操作系统和安装方式,如果要使用 KCL Python 插件 能力,需要确保已经安装了 Python 3.7+ 版本并将 python3 命令添加到您的 PATH 环境变量中。

错误修复

当存在非配置表达式的右值时配置合并顺序错误

schema Resource:
cpu: int
memory: str

schema Config:
resource: Resource

r = Resource {
cpu = 4
memory = "8Gi"
}

config: Config {
resource: Resource {
cpu = 2
memory = "4Gi"
}
}

config: Config {
resource: r
}

在 KCL v0.4.5 版本之前,执行上述代码 (main.k) 会得到非预期的配置值,是因为 KCL 编译器错误地优化了如下形式等效合并配置块

config: Config {
resource: r
resource: Resource {
cpu = 2
memory = "4Gi"
}
}

KCL v0.4.5 版本更新后,修正了不正确配置合并顺序,可以执行 main.k 并获得预期的 YAML 输出:

r:
cpu: 4
memory: 8Gi
config:
resource:
cpu: 4
memory: 8Gi

更多详情请参考 KCL Issue #422

配置 if 表达式类型不匹配错误优化

config: {"A"|"B": int} = {
if True:
A = "2"
}

在 KCL v0.4.5 版本之前,对于配置 if 表达式,执行上述代码会得到预期的配置值导致 Type Unsoundness 问题,是因为 KCL 编译器错误地没有检查出 A 属性的值 "2" 与声明的类型 int 不匹配,KCL v0.4.5 版本更新后,修正了此类问题,可以执行上述代码可以获得预期的类型不匹配错误:

KCL Compile Error[E2G22] : The type got is inconsistent with the type expected
---> File main.k:1:1
1 |config: {"A"|"B": int} = {
1 ^ -> got {str(A):str(2)}
expect {str(A)|str(B):int}, got {str(A):str(2)}

更多详情请参考 KCL Issue #389

Rule 语句校验不生效问题

在之前的 KCL 版本中,在使用如下 rule 规则代码时 (main.k),ServiceCheckRule 的约束代码会不生效。

protocol KubeResourceProtocol:
svc: Service

schema Service:
name: str

rule ServiceCheckRule for KubeResourceProtocol:
svc.name != "name"

svc = Service {
name = "name"
}

ServiceCheckRule {
svc = svc
}

进行改进后,我们执行上述代码,会得到一个准确的校验不通过错误:

KCL Runtime Error[E3B17] : Schema check is failed to check condition
---> File main.k:14
14 |ServiceCheckRule { -> Instance check failed
---> File main.k:8
8 | svc.name != "name" -> Check failed on the condition
Check failed on check conditions

配置块属性类型推导优化

schema Id:
id?: int = 1

schema Config:
data?: {"A"|"B": Id}

c = Config {
data = {
A = Id() # v0.4.5 版本之前,此处会得到一个类型不匹配错误
B = Id()
}
}

在 KCL v0.4.5 版本之前,执行上述代码会得到一个非预期的类型不匹配,是因为 KCL 编译器错误地将 c.data.A 属性的类型推导为 str 类型,导致与 "A"|"B" 字面值联合类型不匹配错误,KCL v0.4.5 版本更新后,修正了此类问题,可以执行上述代码可以获得预期的 YAML 输出:

c:
data:
A:
id: 1
B:
id: 1

赋值语句使用 schema 类型注解错误优化

schema Foo:
foo: int

schema Bar:
bar: int

foo: Foo = Bar { # v0.4.5 版本之前,此处会得到一个运行时类型不匹配错误
bar: 1
}

在 KCL v0.4.5 版本之前,执行上述代码会得到一个运行时类型不匹配错误,版本更新后,会将此类类型不匹配错误优化到编译时,将错误左移,更早地发现此类错误。

KCL 模块类型使用 ?. 运算符类型错误修复

import math

data = math?.log(10) # v0.4.5 版本之前,此处会得到一个非预期的 `math is not defined` 错误

在 KCL v0.4.5 版本之前,执行上述代码会得到一个非预期的变量未定义错误,是因为 KCL 编译器没有正确地处理 math module 类型和 ?. 运算符结合使用的情况,版本更新后,此类问题得到修复。

其他更新与错误修复

更多更新与错误修复 详见

文档更新

KCL 网站 新增 KCL v0.4.5 文档内容并支持版本化语义选项,目前支持 v0.4.3, v0.4.4 和 v0.4.5 版本选择。

社区动态

  • KCL 社区新增两名外部贡献者 @thinkrapido, @Rishav1707, 感谢他们热情并积极地参与贡献。
  • 感谢 @Rishav1707 基于 KCL 建立了 Rust 语言版本的 kcl-loader-rs 子项目,当前版本支持根据 KCL 文件中的 Schema 和配置定义自动生成 Rust 结构体并支持 KCL 值到 Rust 结构体值的反序列化函数。

下一步计划

预计 2023 年 4 月中旬,我们将发布 KCL v0.4.6 版本,预期重点演进包括:

  • KCL 语言进一步编写便利性改进,用户界面持续优化与体验提升,用户支持和痛点解决
  • 全新版本的 KCL Language Server 和 VSCode 语言插件,性能预计提升 20 倍,并预期支持代码警告和错误波浪线提示,跳转,引用查找等核心基础能力
  • 针对 Kubernetes Manifests 配置管理场景痛点持续进行语言能力提升:如设计提供 Helm KCL Schema 插件以及为 kpt 工具提供 KCL SDK 等
  • KCL 包管理工具 KPM 发布,预期支持 Git 仓库代码依赖配置与更新,代码下载等基础能力
  • KCL Playground 支持代码分享能力和 KCL 版本选择能力
  • KCL Go SDK 更多能力支持:如支持 KCL Schema 和 Go 结构体的双向转换等
  • KCL Python SDK 更多能力支持

更多详情请参考 KCL v0.4.6 Milestone

常见问题及解答

详见 KCL 常见问题

其他资源

感谢所有 KCL 用户在此次版本更新过程中提出的宝贵的反馈与建议。更多其他资源请参考:

欢迎加入我们的社区进行交流 👏👏👏:https://github.com/kcl-lang/community