KCL v0.4.6 新版本现在已经可用!本次发布为大家带来了三方面的重点更新:语言、工具链、社区集成 & 扩展支持。
使用 IDE 插件提升 KCL 代码编写体验和效率。
Helm/Kustomize/KPT 云原生社区工具集成。
完善 KCL 多语言 SDK,方便应用程序集成。
您可以在发布页面或者 KCL 官方网站获得下载安装指南和详细信息。
发布页面:
https://github.com/KusionStack/KCLVM/releases/tag/v0.4.6
官网网站:
https://kcl-lang.io/
语言更新
1. 内置函数更新
KCL 字符串新增 removeprefix 和 removesuffix 成员函数用于去除字符串的前缀和后缀子字符串。
data1 = "prefix-string".removeprefix("prefix-") # "string"
data2 = "string-suffix".removesuffix("-suffix") # "string"
更多使用方式详见:https://kcl-lang.io/docs/reference/model/builtin#string-builtin-member-functions
2. 编译器提示信息改进
在之前的 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 "}"
|
3. 错误修复
条件配置块语法解析错误
在之前的 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 语言重写的 LSP Server,相比于之前 KCL 版本性能约提升 20 倍,并支持了 KCL 错误警告在 IDE 中实时显示,以及 KCL 代码补全等基本功能。
错误与告警实时显示
补全
悬停 & 跳转
更多 KCL VS Code 插件安装方式及详细更新内容请参考:https://kcl-lang.io/docs/tools/Ide/vs-code
社区集成&扩展更新
1. 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/KusionStack/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=kcl
注解。
[resource | {if resource.kind == "Deployment": metadata.annotations: {"managed-by" = "kcl"}} for resource in option("resource_list").item
此外,我们为 Kustomize/Helm/KPT 三个工具均提供了常用的容器、服务配置修改和校验的 KCL 模型,并且会持续完善,欢迎社区小伙伴一起参与共建。
更多 Kustomize KCL 插件详细内容以及用例详见:https://kcl-lang.io/docs/user_docs/guides/working-with-k8s/kustomize_kcl_plugin
更多 Helm KCL 插件详细内容以及用例详见:https://kcl-lang.io/docs/user_docs/guides/working-with-k8s/helm_kcl_plugin
更多 KPT KCL 插件详细内容以及用例详见:https://kcl-lang.io/docs/user_docs/guides/working-with-k8s/kpt_kcl_sdk
2. 多语言 SDK
在此次更新中,我们发布了全新的 KCLVM Go SDK 将 KCL 集成到您的 Go 应用程序中,并提供丰富的 API 与 KCL 进行交互。您可以在 https://kcl-lang.io/docs/next/reference/xlang-api/go-api 查询详细的文档。此外我们还更新了如下特性和错误修复:
感谢 @jakezhu9 修复了 KCLVM Go 未预期的 KCL 格式化 API 在 CI Pipeline 中单元测试错误。
感谢 @Ekko 贡献 Go Struct 和 KCL Schema 双向转换支持,详见:
Go Struct -> KCL Schema:https://github.com/KusionStack/kclvm-go/blob/main/pkg/tools/gen/genkcl.go#L23
KCL Schema -> Go Struct:https://github.com/KusionStack/kclvm-go/blob/main/pkg/tools/gen/gengo.go#L23
KCL Schema 到 Protobuf message 的转换支持,详见:https://github.com/KusionStack/kclvm-go/blob/main/pkg/tools/gen/genpb.go#L25
KCL 新增获取 Schema 类型和实例 API,详见:https://kcl-lang.io/docs/reference/xlang-api/go-api#func-getschematyp
其他更新
1. KCL Python Plugin 功能在 v0.4.6 版本后默认不开启,如需开启可参考 KCL Plugin 文档:https://kcl-lang.io/docs/reference/plugin/overview
2. KCL Playground 支持代码分享能力,您可以通过访问 KCL 官网 https://kcl-lang.io/ 并点击 Playground 按钮进行体验。
3. 更多更新详见:https://github.com/KusionStack/KCLVM/milestone/3?closed=1
文档更新
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 模型支持,主要包含容器、服务、计算、存储和网络等。
支持 KCL Schema 直接生成 Kubernetes CRD。
支持 Kubectl 和 Helmfile KCL Plugin,通过 KCL 代码直接生成、编辑和校验 Kubernetes 原生资源。
支持通过 Admission Controller 运行 KCL 代码,对 Kubernetes 资源进行编辑和校验。
更多非 Kubernetes 场景支持,如通过 KCL Schema 对 AI 模型进行数据清理和数据库 Schema 集成支持。
更多计划详情请参考 KCL v0.5.0 Milestone:https://github.com/KusionStack/KCLVM/milestone/5
如果您有更多的想法和需求,欢迎在 KCL Github 仓库发起 issue 或讨论,也欢迎加入我们的社区进行交流 🙌 🙌 🙌
KCL Github issues:
https://github.com/KusionStack/KCLVM/issues
KusionStack Community:
https://github.com/KusionStack/community
其他资源
感谢所有 KCL 用户和社区小伙伴在此次版本更新过程中提出的宝贵反馈与建议。受限于文章篇幅,后续我们会撰写更多 KCL 新版本功能解读系列文章,敬请期待!
更多其他资源请访问:
KCL 网站:https://kcl-lang.io/
Kusion 网站:https://kusionstack.io/
KusionStack Star 一下✨:
https://github.com/KusionStack/KCLVM
https://github.com/KusionStack/kusion
https://github.com/KusionStack/konfig
推荐阅读
精彩回顾|KusionStack 开源啦~
已来到 “后云原生时代” 的我们,如何规模化运维?
Go 代码城市上云——KusionStack 实践
从规模化平台工程实践,我们学到了什么?