KCL v0.4.4 发布! 自定义 YAML Manifests 输出以及 Python SDK!


KCL 团队很高兴地宣布 0.4.4 版本现在已经可用!本次发布主要为 KCL 语言增加了自定义 YAML Manifests 输出的能力,用户可以通过编写代码并调用系统函数来自定义 YAML 输出的样式而无需理解复杂的 schema settings 语义;此外本次发布提供了最新的 KCL Python SDK 可用于 Python 用户对 KCL 直接集成;同时我们大大降低了 KCL 安装包的体积,平均安装包体积降低为之前版本的五分之一,并包含多项编译器报错信息优化和 bug 修复。您可以在 KCL 发布页面 获得更多详细发布信息和 KCL 二进制下载链接。

背景​

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

本文将向读者介绍 KCL 社区的近期动态。

新增特性​

自定义 YAML 格式输出​

在过去的 KCL 版本中,YAML 输出的样式是在 KCL 编译器中是硬编码的,用户可以为 schema 的 __settings__ 元属性设置为不同的值来决定 YAML 输出样式,这带来了较高的复杂度和记忆成本,因此在 0.4.4 版本中我们提供了一个系统库函数用于开发人员更简单地自定义 YAML 输出样式,这个函数的签名如下:

manifests.yaml_stream(values: [any], opts: {str:} = {
sort_keys = False
ignore_private = True
ignore_none = False
sep = "---"
})

这个函数的功能是将 KCL 对象列表序列化为带 --- 分隔符的样式 YAML 输出,它具有两个参数:

  • values - 一个 KCL 对象列表
  • opts - YAML 序列化选项
    • sort_keys:是否按属性名称的字典序对序列化结果进行排序(默认为 False)。
    • ignore_private:是否忽略名称以 _ 开头的属性序列化输出(默认为 True)。
    • ignore_none:是否忽略值为 None 的属性(默认为 False)。
    • sep:在多个 YAML 文档之间选择怎样的分隔符(默认为 "---")。

下面我们通过一个例子来说明:

import manifests

schema Deployment:
apiVersion: str = "v1"
kind: str = "Deployment"
metadata: {str:} = {
name = "deploy"
}
spec: {str:} = {
replica = 2
}

schema Service:
apiVersion: str = "v1"
kind: str = "Service"
metadata: {str:} = {
 name = "svc"
}
spec: {str:} = {}

deployments = [Deployment {}, Deployment {}]
services = [Service {}, Service {}]

manifests.yaml_stream(deployments + services)

首先我们通过 import 关键字导入 manifests 模块并定义 2 个 Deployment 以及 2 个 Service 资源,当我们想以 YAML stream 并以 --- 作为分隔符的格式依次输出这 4 个资源时,我们可以将它们合并为一个 KCL 列表并作为 manifests.yaml_stream 函数的 values 形参进行传入 (如无特殊需求,opts 参数一般使用默认值即可),最终得到 YAML 输出为:

apiVersion: v1
kind: Deployment
metadata:
name: deploy
spec:
replica: 2
---
apiVersion: v1
kind: Deployment
metadata:
name: deploy
spec:
replica: 2
---
apiVersion: v1
kind: Service
metadata:
name: svc
---
apiVersion: v1
kind: Service
metadata:
name: svc

更多信息请参阅:https://github.com/KusionStack/KCLVM/issues/94

Python SDK​

除了已有的 KCL Go SDK, 本次发布还新增了 KCL Python SDK,使用 Python SDK 要求您本地具备高于 3.7.3 的 Python 版本和 pip 包管理工具,可以通过如下命令进行安装并获得帮助信息

$ python3 -m pip install kclvm && python3 -m kclvm --help

命令行工具​

编写名为 main.k 的 KCL 文件:

name = "kcl"
age = 1

schema Person:
name: str = "kcl"
age: int = 1

x0 = Person {}
x1 = Person {
age = 101
}

执行如下命令并获得输出:

$ python3 -m kclvm hello.k
name: kcl
age: 1
x0:
name: kcl
age: 1
x1:
name: kcl
age: 101

API​

此外,我们还可以通过 Python 代码实现对 KCL 文件的执行

编写名为 main.py 的 python 文件:

import kclvm.program.exec as kclvm_exec
import kclvm.vm.planner as planner

print(planner.plan(kclvm_exec.Run(["hello.k"]).filter_by_path_selector()))

执行如下命令并获得输出:

$ python3 main.py
name: kcl
age: 1
x0:
name: kcl
age: 1
x1:
name: kcl
age: 101

可以看出通过命令行工具和 API 可以获得同样的输出。

目前 KCL Python SDK 还处于早期预览版本,后续 KCL 团队会持续更新并提供更丰富的功能,更多信息请参阅:https://github.com/KusionStack/kclvm-py

安装体积优化​

在新的 KCL 版本中,我们将 KCL 内置的 Python3 剥离,使得 KCL 二进制压缩包的体积从平均 200M 降低为 35M,用户可以更快地下载并使用 KCL,并且 Python Plugin 成为一个可选项,如果您想启用 KCL Python 插件,一个额外要求是需要您本地具备高于 3.7.3 版本的 Python 以及 pip 包管理工具,更多详情请参考 https://github.com/KusionStack/kcl-plugin

错误修复​

函数调用错误信息优化​

在 0.4.4 版本中,KCL 优化了当函数参数个数不匹配时的错误信息输出,支持显示函数名称以及参数不匹配个数

schema Foo[x: int]:
bar?: int = x

f = lambda x {
x + 1
}

foo = Foo(1,2,3)# Error: "Foo" takes 1 positional argument but 3 were given
f(1,2)# Error: "f" takes 1 positional argument but 2 were given

更多信息请参阅:https://github.com/KusionStack/KCLVM/issues/299

插值三引号字符串格式化错误修复​

在之前的 KCL 版本中,对如下代码进行格式化会错误将携带字符串插值的三引号格式化为单引号字符串并导致编译错误,在 0.4.4 版本中我们进行了修复

# Before KCL v0.4.4, variable "bar" will be formatted as:
#
# foo = 1
# bar = "
# ${foo}
# "
foo = 1
bar = """
${foo}
"""
Copy

更多信息请参阅:https://github.com/KusionStack/KCLVM/issues/294

其他错误修复​

更多错误修复详见:https://github.com/KusionStack/KCLVM/milestone/2?closed=1

文档​

KCL 网站 初步建立,并完善 Kubernetes 场景相关文档.

更多网站信息详见 https://kcl-lang.github.io/

社区动态​

KCL 社区新增三名外部贡献者 @my-vegetable-has-exploded, @possible-fqz, @orangebees, 感谢他们热情并积极地参与贡献

下一步计划​

预计 2023 年 1 月底,我们将发布 KCL v0.4.5 版本,预期重点演进包括

  • 语言用户界面持续优化,体验持续提升和用户痛点解决
  • 更多场景和生态如 Kubernetes 和 CI/CD Pipeline 场景 KCL 支持和文档更新
  • KCL Windows 版本支持
  • KCL 包管理工具 kpm 发布
  • KCL 新版 playground 支持

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

常见问题及解答​

常见问题及解答详见:https://kcl-lang.github.io/docs/user_docs/support/

其他资源​

  • KCL 网站
  • Kusion 网站
  • KCL 仓库
  • Kusion 仓库
  • Konfig 仓库

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


相關推薦

2023-02-28

线提示,跳转,引用查找等核心基础能力 针对 Kubernetes Manifests 配置管理场景痛点持续进行语言能力提升:如设计提供 Helm KCL Schema 插件以及为 kpt 工具提供 KCL SDK 等 KCL 包管理工具 KPM 发布,预期支持 Git 仓

2023-04-18

CL 团队很高兴地宣布 KCL v0.4.6 新版本现在已经可用!本次发布为大家带来了三方面的重点更新:语言、工具链、社区集成 & 扩展支持。 使用 IDE 插件提升 KCL 代码编写体验和效率 Helm/Kustomize/KPT 云原生社区工具集成 完善 KC

2023-07-18

CL 团队很高兴地宣布 KCL v0.5.0 新版本现在已经可用!本次发布为大家带来了三方面的重点更新:语言、工具链、社区集成 & 扩展支持。 使用功能更完善错误更少的 KCL 语言和 IDE 提升代码编写体验和效率 使用 KPM, KCL OpenAPI

2023-10-14

Service 资源的类型设置为 LoadBalancer,编写如下 YAML 文件 (manifests.yaml): apiVersion: krm.kcl.dev/v1alpha1 kind: KCLRun metadata: name: disallow-svc-lb annotations: krm.kcl.dev/version: 0.0.1 krm.kcl.dev/type: validation documentation: >- A validation that prevents the crea

2022-12-02

5s   编写代码管理 Kubernetes 资源 对于 Kubernetes 资源发布时,我们常常会遇到配置参数需要动态指定的场景,比如不同的环境需要设置不同的 image 字段值生成不同环境的资源。对于这种场景,我们可以通过 KCL 的条

2024-01-05

社区小伙伴在社区中提出的宝贵反馈与建议。后续我们会发布更多 KCL 云原生模型和工具集成文章,敬请期待! 查看 KCL 社区 加入我们。 更多其他资源请参考: KCL 网站 KusionStack 网站 KCL v0.8.0 Milestone

2023-12-02

ort .app # Convert the `App` model into Kubernetes Deployment and Service Manifests test_kubernetesRender = lambda { a = app.App { name = "app" containers.ngnix = { image = "ngnix" ports = [{containerPort = 80}] } service.ports = [{ port = 80 }] } deployment_got = kubernetesRender(a) assert deploym

2023-11-10

KCL 包管理工具 KPM 更新 -  更流畅的创建、发布 KCL 包的工作流:支持基于版本系统的包更新和发布的自动化流程;此外,现已允许对KCL包的元信息自定义配置 KCL 模型更新 - 开箱即用的 KCL 模型新增至 120

2023-08-11

lue: false transformers: # Use KCL Plugin to mutate or validate Kubernetes manifests. - apiVersion: krm.kcl.dev/v1alpha1 kind: KCLRun metadata: name: "set-annotation" annotations: config.kubernetes.io/function: | container: image: docker.io/kcllang/kustomize-kcl:v0.2.0 spec: source: | [resource | {i

2023-04-28

的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更快的自动化集成和良好的生态延展性。 KCL Go SDK 是什么? kclvm 是一个 KCL 语言的运行时库,它提供了一个与 KCL 编译器交互的编程接口。它是一个客户端库,可用

2023-05-25

基于 Spring Authorization Server 的、全新架构的 Dante Cloud 版本发布 2022.07.01 基于 Vue3、Vite2、Pinia、Quasar2、Typescript、Hooks 等最新技术栈全新构建前端工程正式发布 2022.07.30 正式加入 Dromara 开源社区,项目名称由 Eurynome Cloud 更名为 D

2023-08-24

属性默认值 📰 官网和用例更新 新增通过 docker.io 发布 KCL 包用例: https://github.com/kcl-lang/kpm/blob/main/docs/publish_to_docker_reg.md 新增 KCL Gitlab CI 集成用例: https://kcl-lang.io/docs/user_docs/guides/ci-integration/gitlab-ci 新增 KCL 密

2023-10-25

缘主机的指定目录中,以 JSON 或者 YAML 的形式写入 Pod 的 Manifests 文件,Edged 会监控这个目录下的文件来创建/删除边缘静态 Pod,并在集群中创建镜像 Pod。 静态 Pod 默认目录是 /etc/kubeedge/manifests,你也可以通过修改 EdgeCore 配置的

2023-11-24

Schema 参数数量的检查 🔧 工具链更新 测试工具发布 支持使用 KCL 函数编写单元测试并使用工具执行测试 支持使用正则表达式过滤待测试用例 支持单元测试快速失败功能 导入工具更新 修复 patterns 到正则匹