KCL v0.4.6 发布 - 全新的 IDE 插件,Helm/Kustomize/KPT 工具集成


KCL v0.4.6 重磅发布 - 全新的 IDE 插件,Helm/Kustomize/KPT 工具集成

简介

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

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

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

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

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

语言更新

内置函数更新

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

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 "}"
|

错误修复

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

在之前的 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.gif

  • 跳转

GotoDef.gif

  • 补全

Completion.gif

  • 悬停

Hover.gif

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

Kusion VS Code 插件

在 KCL VS Code 插件的基础上,我们还提供了与云原生运维发布场景结合更紧密的 Kusion 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

demo = 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 输出

$ kcl main.k -S demo
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
  • 更多 KCL 包管理工具安装方式、详细内容及用例详见
  • 更多 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/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=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

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

  • 感谢 @jakezhu9 修复了 kclvm-go 未预期的 KCL 格式化 API 在 CI Pipeline 中单元测试错误
  • 感谢 @Ekko 贡献 Go struct 和 KCL schema 双向转换支持,详见:
    • Go struct -> KCL schema
    • KCL schema -> Go struct
  • 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 新版本功能解读系列文章,敬请期待!

更多其他资源请参考:

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

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


相關推薦

2023-07-18

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

2023-03-21

-alpha.1 版本现在已经可用! 您可以在 KCL v0.4.6-alpha.1 发布页面 或者 KCL 官方网站 获得 KCL 二进制下载链接和更多详细发布信息。 KCL 是一个开源的基于约束的记录及函数语言,期望通过成熟的编程语言技术和

2023-12-02

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

2023-02-28

KCL 团队很高兴地宣布 KCL v0.4.5 版本现在已经可用!本次发布主要为 KCL 语言编写便利性和稳定性提升,错误信息改进以及更多平台包括 windows 版本支持以及更多下载方式支持。在 KCL v0.4.5 版本中,用户可以通过编写更少的 KCL

2023-10-14

合并内容概述 🔧 语言及工具链更新 KCL v0.6.0 于 9.15 发布,更新内容包括语言、工具链、社区集成,详细内容请查看 https://mp.weixin.qq.com/s/f6RCZqxS2iliRGIz0036yA KCL IDE 更新 - 支持对标准库和内置函数的悬停提示,支持对 KCL 代码

2023-11-10

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

2023-04-28

令行,支持用户通过go install来一键安装 kclvm 的 Go 命令行工具 kcl-go,其要求本地 Go 版本为1.18+, 同时要求本地有完整的 CGO 工具链。 只需执行 go install kusionstack.io/kclvm-go/cmds/kcl-go@latest 新建 KCL 源文件 hello.k apiVersion = "apps/v1"

2023-11-24

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

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-08-11

ions: config.kubernetes.io/function: | container: image: docker.io/kcllang/kustomize-kcl:v0.2.0 spec: source: | [resource | {if resource.kind == "Deployment": metadata.annotations: {"managed-by" = "helmfile-kcl"}} for resource in option("resource_list").items] 在上述配置中,我们引用了

2024-01-05

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

2023-03-23

热乎的 PR:https://github.com/KusionStack/KCLVM/pull/460 效果展示:  

2022-12-09

KCL 团队很高兴地宣布 0.4.4 版本现在已经可用!本次发布主要为 KCL 语言增加了自定义 YAML Manifests 输出的能力,用户可以通过编写代码并调用系统函数来自定义 YAML 输出的样式而无需理解复杂的 schema settings 语义;此外本次发布

2023-01-31

人 FM / 每日推荐歌曲等功能,但无任何社交功能。目前已发布 0.4.6 版本,带来如下变更: fix: 错误的选择了音源质量 #1589 feat: 添加带有 loading 属性的 img 标签,以实现延迟加载 #1597 fix: 渲染周数据错误问题 #1598 fix: