Skip to main content

1 post tagged with "Release Blog"

查看所有标签

· 阅读需要 1 分钟

简介

KCL 团队很高兴地宣布 KCL v0.10.0 新版本现在已经可用!本次发布为大家带来了三方面的重点更新

  • 使用功能更完善和错误更少的 KCL 语言、工具链和 IDE 提升代码编写体验和效率
  • 更加全面丰富的标准库、三方库以及社区生态集成,涵盖不同应用场景和需求
  • WASM SDK 支持无缝的浏览器运行与全新的 KCL Playground

KCL 是一个 CNCF 基金会托管的基于约束的记录及函数语言,期望通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更简单的自动化和生态工具集成。

❤️ 特别鸣谢

感谢 KCL 在 v0.9 - v0.10 版本迭代所有 80 位社区参与者,以下排名不分先后

@eshepelyuk, @haarchri, @liangyuanpeng, @logo749, @bilalba, @borgius, @patrick-hermann-sva, @ovk, @east4ming, @wmcnamee-coreweave, @steeling, @sschne, @Jacob Colvin, @Richard Holmes, @Christopher Haar, @Yvan da Silva, @Uladzislau Maher, @Sergey Ryabin, @Lukáš Kubín, @Alexander Fuchs, @Divyansh Choukse, @Vishalk91-4, @DavidChevallier, @dennybaa, @bozaro, @vietanhtwdk, @hoangndst, @patpicos, @metacoma, @karlderkaefer, @kukacz, @Matthew Hodgkins, @Gao Jun, @Zack Zhang, @briheet, @Moulick, @stmcginnis, @Manoramsharma, @NishantBansal2003, @varshith257, @Harsh4902, @Gmin2, @shishir-11, @RehanChalana, @Shruti78, @jianzs, @vinayakjaas, @ChrisK, @Lan Liang, @Endre Karlson, @suin, @v3xro, @soubinan, @juanzolotoochin, @mnacharov, @ron1, @vfarcic, @phisco, @juanique, @zackzhangverkada, @warmuuh, @novohool, @officialasishkumar, @cx2c, @yonas, @shruti2522, @nwmcsween, @trogowski, @johnallen3d, @riven-blade, @gesmit74, @prakhar479, @Peter Boat, @Stéphane Este-Gracias, @Josh West, @Brandon Nason, @Anany, @dansrogers, @diefans, @DrummyFloyd

📚 重点更新内容

🔧 核心功能

语言

  • 赋值语句中被赋值对象支持属性访问和索引访问。

现在,你可以通过索引访问的方式对被赋值对象的内容进行更改。

_a = [0, 1] * 2
_a[0] = 2
_a[1] += 2
a = _a

通过编译,你将可以得到如下结果

a:
- 2
- 3
- 0
- 1

你也可以通过属性访问的方式对被赋值对象的内容进行更改。

_a = [{key1.key2 = [0] * 2}, {key3.key4 = [0] * 2}]
_a[0].key1.key2[0] = 1
_a[1].key3.key4[1] += 1
a = _a

通过编译,你可以得到如下结果:

a:
- key1:
key2:
- 1
- 0
- key3:
key4:
- 0
- 1
  • 对类型为单子面值常量 Schema 属性支持省略默认值
schema Deployment:
apiVersion: "apps/v1" = "apps/v1"
schema Deployment:
apiVersion: "apps/v1" # 类型值与默认值相同,可以省略默认值
  • 修复了 KCL 嵌套多层 config 块语义检查时间过长的问题。
  • 去掉了语义解析器中的 unwrap() 语句, 减少 panic 的问题。
  • 修复了带有 list index 的字段合并运算的计算错误。
  • 修复 as 关键字在外部包存在时类型转换的错误
  • 修复在 lambda 函数中 config 到 schema 的类型检查错误
  • 优化函数参数调用/返回值 Dict 转 Schema 类型推导和检查,可以省略 Schema 名称简化配置书写
  • 赋值语句支持形如 _config["key"] = "value" 或 _config.key = "value"的语法对配置进行原地修改
  • 优化配置合并运算符的类型检查,可以在编译时发现更多类型错误
  • 修复了 built-in API datetime 中日期格式的问题。
  • 修复了 Schema 配置合并参数解析错误的问题。
  • 优化了 KCL 部分报错信息。
  • KCL 修复了 Schema 继承中循环依赖导致的异常错误。
  • KCL 修复了配置自动合并失效的问题。
  • KCL 优化了 Schema 继承中循环依赖的错误信息。
  • KCL 对编译入口部分代码进行了重构。
  • KCL 新增了 windows mingw 环境下链接库的 release。
  • KCL 修复了 windows 环境下的 CI 错误。
  • 优化了 KCL 运行时错误信息并且新增了部分测试用例。

工具链

  • kcl test 测试工具支持测试用例中的 print 函数输出

你可以在测试用例中使用 print 输出日志

test_print = lambda {
print("Test Begin ...")
}

通过 kcl test 命令运行测试用例,你可以看到对应日志:

test_print: PASS (9ms)
Test Begin ...

--------------------------------------------------------------------------------
PASS: 1/1
  • kcl import 工具新增对包含 AllOf 验证字段的 JSON Schema 格式导入为 KCL Schema 的支持

对于如下包含 AllOf 验证字段的 JSON Schema:

{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://example.com/schemas/config",
"description": "Schema for representing a config information.",
"type": "object",
"properties": {
"name": {
"type": "string",
"allOf": [
{
"pattern": "198.160"
},
{
"pattern": "198.161"
},
{
"pattern": "198.162"
}
]
},
"price": {
"type": "number",
"minimum": 0
}
},
"required": ["name"]
}

将会生成对应 KCL Schema:

"""
This file was generated by the KCL auto-gen tool. DO NOT EDIT.
Editing this file might prove futile when you re-run the KCL auto-gen generate command.
"""
import regex

schema Config:
r"""
Schema for representing a config information.

Attributes
----------
name : str, required
price : float, optional
"""

name: str
price?: float

check:
regex.match(name, r"198.160")
regex.match(name, r"198.161")
regex.match(name, r"198.162")
price >= 0 if price
  • 包管理工具支持添加 Git 仓库中子包作为三方库。

通过如下命令,KCL 包管理工具支持添加 git 仓库中的某个子目录下的 KCL Package 作为三方库。

kcl mod add <package_name> --git <git_url> --commit <commit_id>

https://github.com/kcl-lang/flask-demo-kcl-manifests.git 为例,添加这个仓库中的子目录中名为 cc 的 KCL package 作为依赖:

kcl mod add cc --git https://github.com/kcl-lang/flask-demo-kcl-manifests.git --commit 8308200

kclplayground

  • kcl import 工具支持导入整个 Go Package 并将其中所有的 Go 结构体定义转换为 KCL Schema 定义
  • 修复 kcl import 在 Kubernetes CRD 和 OpenAPI 导入 Schema 的编译错误
  • 优化 kcl mod init 的输出格式
  • kcl fmt 工具支持保留用户在多个代码片段之间的空行,不会全部删除
  • 包管理工具修复了编译入口无法识别包相对路径 ${KCL_MOD} 的问题。
  • 包管理工具将 plainHttp 选项调整为可选。
  • 包管理工具修复了编译入口识别错误根目录的问题。
  • 包管理工具添加登录凭证的缓存,以降低安全风险。
  • 包管理工具修复了由于虚拟编译入口导致的编译失败问题。
  • 包管理工具修复了默认依赖在 kcl.mod 中的缺失。
  • 包管理工具修复了 vendor path 计算错误导致的三方库重新下载的问题。
  • 包管理工具修复了 push https 协议 OCI registry 失败的问题。
  • 包管理工具修复了多次添加 git 子包作为依赖时导致的循环依赖问题。
  • 包管理工具修复了 metadata 中三方库依赖路径丢失的问题。
  • 包管理工具 Add, Update 命令预载了 MVS 版本管理算法,通过环境变量 SupportMVS=true 控制开启。
  • 包管理工具修复了编译多个 *.k 文件失败的 bug。
  • 包管理工具新增部分测试用例。
  • KCL tree-sitter 新增 sequence operations, selector 支持。
  • KCL tree-sitter 优化了部分语法规则,添加了更多测试用例。
  • 修复 kcl fmt 工具对 Schema 索引签名注释错误的格式化位置
  • 修复 kcl import 导入 Kubernetes CRD 时设置 -o 参数非预期的报错
  • 修复 kcl import 导入空 Go 结构体输出非预期的 KCL Schema 错误
  • kcl-openapi 对代码结构和文档结构进行了优化和调整。
  • kcl-playground 添加了更多的测试用例,对工程结构体进行了优化和升级。
  • krm-kcl function 修复了部分测试和文档中的错误。
  • krm-kcl function 修复了依赖下载失败的问题。
  • kcl-operator 更新和修复了部分文档内容,优化了部分代码结构。
  • kcl-operator 新增部分测试用例,优化了发布流程。
  • kcl-operator 新增了初始化容器时的自动鉴权。
  • KCL fmt 工具提供了 C api。
  • KCL fmt 工具移除了 if 块中多余的空行。

IDE

  • IDE 新增了对 schema 参数的 hints。

schemaargshint

  • 修正了 schema index signature key 的语义高亮。
  • 支持使用 kcl.work 配置文件划分 IDE 工作空间
  • 修复 Schema 示例化参数无法显示语义信息的问题
  • 修复了 IDE 中 schema doc 的错误补全。
  • 修复了 IDE 中 unification 块中定义的属性无法自动补全的问题。
  • 支持 Schema 实例化时区分属性和值语义的细粒度补全。
  • KCL vim 插件更新安装文档。
  • KCL vscode 插件移除了 yaml 文件的响应。
  • KCL vscode 插件补充了 Apache 2.0 License
  • 修复 Schema 使用 : 合并运算符定义属性实例化时的补全
  • 修复在 Schema Doc 中非预期的补全
  • 修复 kcl-language-server 命令行版本显示问题
  • 支持 NeoVim, VS Code 等插件禁用保存时格式化配置
  • KCL NeoVim 插件移除默认的 key bindings, 支持用户自定义
  • 修复了第一行第一列代码高亮失效的问题。
  • 修复了 IDE 偶发死锁的问题。
  • IDE 增加了更多输出日志。
  • IDE find ref 功能优化。
  • IDE 修复了更新 kcl.mod 失效的问题。
  • IDE 修复了 find ref 错误。
  • IDE 修复了打开文件时代码高亮失败。
  • LSP 部分代码结构重构,调整了部分 API 的作用域。
  • IDE 修复了 kpm 更新依赖后,IDE 没有同步更新的问题。
  • IDE 修复了由循环依赖导致的崩溃。
  • IDE 修复了 find reference 在 minin 结构中的错误。
  • IDE 修复了 if 表达式中自动补全失效的问题。
  • IDE 修复了带有索引签名的 Schema 成员高亮失效的问题。
  • KCL intellij IDE 插件支持 LSP4IJ。

API

📦️ 标准库及三方库

标准库

  • 新增 file.current() 函数用以获取当前运行 KCL 文件的全路径。
import file

a = file.current()

通过编译,你可以得到如下结果:

a: /Users/xxx/xxx/main.k # 当前编译的文件路径
  • 加密标准库新增参数,支持对参数传入参数进行编码。
sha512(value: str, encoding: str = "utf-8") -> str
  • 新增 built-in API crypto.blake3 支持使用 Blake 算法进行哈希加密。
import crypto
blake3 = crypto.blake3("ABCDEF")
  • 新增 built-in API isnullish 支持判断字段是否为空。
a = [100, 10, 100]
A = isnullish(a)
e = None
E = isnullish(e)
  • 新增 built-in API datetime.validate 支持验证日期内容。
import datetime
assert datetime.validate("2024-08-26", "%Y-%m-%d")

三方库

  • cluster-api-provider-azure 更新至 v1.16.0
  • cluster-api 更新至 v1.7.4
  • konfig 更新至 v0.6.0
  • karmada 更新至 v0.1.1
  • k8s 更新至 1.31
  • gateway-api 更新至 0.2.0
  • karpenter 更新至 0.2.0
  • crossplane 更新至 1.16.0
  • cilium 更新至 0.3.0
  • external-secrets 更新至 0.1.2
  • 新增模型列表
    • fluxcd-kcl-controller
    • fluxcd-kustomize-controller
    • fluxcd-helm-controller
    • fluxcd-source-controller
    • fluxcd-image-reflector-controller
    • fluxcd-image-automation-controller
    • fluxcd-notification-controller
    • kwok
    • crossplane-provider-vault 1.0.0
    • outdent 0.1.0
    • kcl_lib 0.1.0

☸️ 生态集成

  • Flux KCL Controller 发布 v0.4.0 版本,对齐绝大部份 Flux Kustomize Controller 功能,满足直接使用 KCL 代替 Kustomize 作 Flux GitOps 的需求
  • KRM KCL 规范发布 v0.10.0 beta 版本,新增私有 Git 仓库拉取和忽略 TLS 检查等功能
  • KCL Nix Package 发布 v0.9.8 版本
  • Crossplane KCL Function 发布 v0.9.4 版本,具体内容详见 https://github.com/crossplane-contrib/function-kcl
  • KCL Bazel Rules 更新 KCL v0.10.0 beta 版本,具体内容详见 https://github.com/kcl-lang/rules_kcl
  • Flux KCL Controller 传入参数优化, 新增更多的测试用例,更加完整的 release 和测试流程。

🧩 多语言 SDK 和插件

多语言 SDK

  • KCL Go SDK 支持通过 build tags 区分以 RPC 模式还是 CGO 模式与 KCL 核心 Rust API 进行交互,默认为 CGO 模式,可以通过 -tags rpc 开启 RPC 模式
  • 新增 KCL C/C++ 语言 SDK。
  • 新增了 Go, Java, Python, Rust, .NET, C/C++ 等多语言 API Spec,相关文档,测试用例和使用案例。
  • 代码结构调整,go 相关代码移动的 go 文件目录中。
  • 新增 KCL Kotlin 和 Swift 语言初版 SDK,尚未正式发布依赖包,欢迎参与贡献
  • 新增 KCL WASM lib 支持 node.js 和 浏览器集成。
  • 重构优化了 KCL python/Go/Java 的部分代码。
  • KCL WASM SDK 修复了 '\0' 转义符号导致的问题。
  • KCL lib 支持跨平台编译。
  • KCL WASM SDK 增加部分测试用例。

多语言插件更新

  • KCL Plugin 支持通过 Rust 开发。
  • 新增部分插件开发测试用例。

📖 文档更新

  • 新增 Python, Java, Node.js, Rust, WASM, .NET, C/C++ 等多语言 API 文档。
  • 更新了 IDE Quick Start 文档。
  • 新增博客 A Comparative Overview of Jsonnet and KCL
  • 更新文档 Adapt From Kubernetes中的 crd 资源。
  • 新增了 KCL 在 kubecon 2024 的回顾文章。
  • 文档中增加了新增 built-in API 相关的文档。
  • 调整了文档中包管理工具与 OCI registry 和 Git Repo 部分集成的文档。
  • 新增了文档中关于 kcl.mod include 和 exclude 字段的描述。
  • 新增了关于 docker-credential-desktop not found 的解决方案。
  • 新增了 konfig 库部分资源的参考文档。
  • 新增了关于 KCL WASM 相关的 API 文档。
  • 新增了关于 Rust 开发 KCL 插件相关的 API。
  • 新增了关于 mixin 和 protocol 相关的 FAQ 文档。
  • 修复了部分文档错误。

🌐 其他资源

🔥 查看 KCL 社区 加入我们 🔥

更多其他资源请参考:

· 阅读需要 1 分钟

简介

KCL 团队很高兴地宣布 KCL v0.9.0 新版本现在已经可用!本次发布为大家带来了三方面的重点更新

  • 使用性能更好、功能更完善和错误更少的 KCL 语言、工具链和 IDE 提升代码编写体验和效率
  • 更加全面丰富的标准库、三方库以及社区生态集成,涵盖不同应用场景和需求
  • 更丰富的多语言 SDK 和插件,无缝地集成不同编程语言和开发环境

KCL 是一个 CNCF 基金会托管的基于约束的记录及函数语言,期望通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生 Kubernetes 配置场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更简单的自动化和生态工具集成。

❤️ 特别鸣谢

感谢 KCL 在 v0.8 - v0.9 版本迭代过去 120 天中所有 120 位社区参与者,以下排名不分先后

@Shashank Mittal, @MattHodge, @officialasishkumar, @Gmin2, @Akash Kumar, @sfshumaker, @sanzoghenzo, @MOHAMED FAWAS, @bradkwadsworth-mw, @excalq, @Daksh-10, @metacoma, @Wes McNamee, @Stéphane Este-Gracias, @octonawish-akcodes, @zong-zhe, @shashank-iitbhu, @NAVRockClimber, @AkashKumar7902, @Petrosz007, @patrycju, @Korada Vishal, @selfuryon, @tvandinther, @vtomilov, @Peefy, @taylormonacelli, @Tertium, @Stefano Borrelli, @Bishal, @kukacz, @borgius, @steeling, @jheyduk, @HStéphane Este-Gracias, @userxiaosi, @folliehiyuki, @kubernegit, @nizq, @Alexander Fuchs, @ihor-hrytskiv, @Mohamed Asif, @reedjosh, @Wck-iipi, @evensolberg, @aldoborrero@ron18219, @rodrigoalvamat, @mproffitt, @karlhepler, @shruti2522, @leon-andria, @prahaladramji, @Even Solberg, @utnim2, @warjiang, @Asish Kumar, @He1pa, @Emmanuel Alap, @d4v1d03, @Yvan da Silva, @Abhishek, @DavidChevallier, @zargor, @Kim Sondrup, @SamirMarin, @Hai Wu, @MatisseB, @beholdenkey, @nestoralonso, @HAkash Kumar, @olinux, @liangyuanpeng, @ngergs, @Penguin, @ealap, @markphillips100, @Henri Williams, @eshepelyuk, @CC007, @mintu, @M Slane, @zhuxw, @atelsier, @aleeriz, @LinYunling, @YvanDaSilva, @chai2010, @Sergey Ryabin, @vfarcic, @vemoo, @riven-blade, @ibishal, @empath-nirvana, @bozaro, @jgascon-nx, @reckless-huang, @Sergei Iakovlev, @Blarc, @JeevaRamanathan, @dennybaa, @PrettySolution, @east4ming, @nkabir, @sestegra, @XiaoK29, @ricochet1k, @yjsnly, @umaher, @SjuulJanssen, @wilsonwang371, @Lukáš Kubín, @samuel-deal-tisseo, @blakebarnett, @Uladzislau Maher, @ytsarev, @Vishalk91-4, @Stephen C, @Tom van Dinther, @MrGuoRanDuo, @dopesickjam

📚 重点更新内容

⚡️ 性能提升

运行性能

在 KCL v0.9 新版本中,引入了一个新的快速运行模式,可以通过设置 KCL_FAST_EVAL=1 环境变量开启,从而提升启动速度和运行时性能。

对于使用 Schema 的配置(比如 k8s 三方库),相比于之前的版本可以获得 3 倍左右的性能提升。对于简单的不使用 Schema 的配置,输出 YAML 性能经测试超过 helm templatekustomize build 等使用 YAML 和 Go Template 的工具。

IDE 性能

KCL IDE 在大型项目上针对语义分析部分进行了进一步的增量编译和性能优化,对于 400 个文件左右的 KCL 项目, IDE 端到端响应时间可以减小为之前版本的 20%

🔧 核心功能

语言

  • 字符串插值支持类似 Shell 的 \${} 转义功能取消插值
world = "world"
hello_world_0 = "hello ${world}" # hello world
hello_world_1 = "hello \${world}" # hello ${world}
  • typeof 函数新增 Schema 类型的支持用于区分 schema 类型和实例
schema Foo:
bar?: str

foo = Foo {}
type_schema = typeof(foo) # schema
type_type = typeof(Foo) # type
  • Schema 的 instances() 方法新增关键字参数 full_pkg 参数用于读取所有代码中对应 Schema 的实例
schema Person:
name: str

alice = Person {name = "Alice"}
all_persons = Person.instances(True)
  • 去除 bool 类型和 int 类型隐式比较的功能 0 < True
  • 去除 list 类型的比较功能 [0] < [1]
  • as 关键字增加类型断言失败功能
  • 优化 lambda 函数和配置代码块 {} 在不同作用域的闭包变量捕获逻辑,更符合直觉

工具链

  • kcl run 支持使用 --format toml 输出 TOML 格式的配置
  • kcl mod add 支持使用 --oci--git 添加私有三方 OCI Registry 和 Git 仓库的依赖
  • kcl import 支持从整个 Go Package 导入为 KCL Schema
  • kcl import 支持导入带 YAML Stream --- 格式的文件
  • kcl import 支持从 TOML 文件导入为 KCL 配置
  • kcl clean 支持清理外部依赖和编译缓存
  • kcl mod init 支持 --version 标签设置 KCL 新建模块的版本
  • kcl run, kcl mod addkcl mod pull 等命令支持通过本地 Git 对私有仓库进行访问

IDE

  • 支持多个 Quick Fix 修复选项
  • 支持 kcl.modkcl.mod.lock 文件的高亮
  • IDE 支持部分语法悬停高亮
  • 支持 import 对外部依赖的补全
  • 支持函数符号的高亮和 Inlay Hints 显示缺省的变量类型

inlayhint

API

  • Override API 支持设置配置覆盖时使用不同的属性运算符 :, =+=
  • Go API 支持 prototext 格式和 KCL schema 输出为 KCL 配置
  • Go API 支持任意 Go Type 和 Go Value 序列化为 KCL Schema 和配置

📦️ 标准库及三方库

标准库

  • 新增标准库 file 用于文件 IO 操作,比如从 YAML 读取配置并进行配置合并操作
import file
import yaml
import json_merge_patch as p

config = p.merge(yaml.decode(file.read("deployment.yaml")), {
metadata.name = "override_value"
})

其他更多 file 模块函数详见:https://www.kcl-lang.io/docs/reference/model/file

  • 新增标准库 template 用于模版配置编写
import template

_data = {
name = "handlebars",
v = [ { a = 1 }, { a = 2 } ],
c = { d = 5 },
g = { b = [ { aa = { bb = 55} }, { aa = { bb = 66} } ] },
people = [ "Yehuda Katz", "Alan Johnson", "Charles Jolley" ]
}

content = template.execute("""\
Hello world from {{name}}

{{#each v}}
{{this.a}}
{{/each}}
{{ c.d }}
{{#each people}}
{{ this }}
{{/each}}
{{#each g.b}}
{{this.aa.bb}}
{{/each}}
""", _data)
  • 新增标准库 runtime 可以用于捕获运行时异常,并用于 kcl test 工具测试异常用例
import runtime

schema Person:
name: str
age: int

check:
0 <= age <= 120, "age must be in [1, 120], got ${age}"

test_person_check_error = lambda {
assert runtime.catch(lambda {
p = Person {name = "Alice", age: -1}
}) == "age must be in [1, 120], got -1"
}

三方库

KCL 模型数量新增至 313 个, 主要包含如下更新:

  • k8s 发布 1.30 版本
  • argo-cd 发布 0.1.1 版本
  • argo-workflow 0.0.3 版本
  • istio 发布 1.21.2 版本
  • victoria-metrics-operator 发布 0.45.1 版本
  • cert-manager 发布 0.1.2 版本
  • cilium 发布 0.1.1 版本
  • Longhorn 发布 0.0.1 版本
  • jsonpatch 发布 0.0.5 版本,支持 rfc6901Decode
  • 新增 difflib 三方库,支持比较配置差异
  • 新增 argo-cd-order 用于排序 argocd 同步操作的资源顺序
  • 新增 cluster-api 相关的模型库:包括 cluster-api, cluster-api-provider-metal3, cluster-api-provider-gcp, cluster-api-addon-provider-helm, cluster-api-addon-provider-aws, cluster-api-provider-azure

☸️ 生态集成

apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: example
spec:
compositeTypeRef:
apiVersion: example.crossplane.io/v1beta1
kind: XR
mode: Pipeline
pipeline:
- step: basic
functionRef:
name: function-kcl
input:
apiVersion: krm.kcl.dev/v1alpha1
kind: KCLInput
source: |
# Read the XR
oxr = option("params").oxr
# Patch the XR with the status field
dxr = oxr | {
status.dummy = "cool-status"
}
# Construct a AWS bucket
bucket = {
apiVersion = "s3.aws.upbound.io/v1beta1"
kind = "Bucket"
metadata.annotations: {
"krm.kcl.dev/composition-resource-name" = "bucket"
}
spec.forProvider.region = option("oxr").spec.region
}
# Return the bucket and patched XR
items = [bucket, dxr]
- step: automatically-detect-ready-composed-resources
functionRef:
name: function-auto-ready

此外,可以在这里找到更多的关于 KCL 和其他生态项目一起使用的真实用例

🧩 多语言 SDK 和插件

多语言 SDK

KCL 多语言 SDK 新增至 7 个, 目前主要支持 Rust, Go, Java, .NET, Python, Node.js 和 WASM,无需额外安装 KCL 命令行即可使用,安装体积优化为之前版本的 90%,且不需要复杂的系统依赖。

此外,不同的 SDK 均提供了相同的 API,主要包括代码运行,代码分析,类型解析和添加外部依赖等操作,下面以 Java 和 C# SDK 为例

  • Java
import com.kcl.api.API;
import com.kcl.api.Spec.ExecProgram_Args;
import com.kcl.api.Spec.ExecProgram_Result;

public class ExecProgramTest {
public static void main(String[] args) throws Exception {
API api = new API();
ExecProgram_Result result = api
.execProgram(ExecProgram_Args.newBuilder().addKFilenameList("path/to/kcl.k").build());
System.out.println(result.getYamlResult());
}
}
  • C#
namespace KclLib.Tests;

using KclLib.API;

public class KclLibAPITest
{
public static void Main()
{
var execArgs = new ExecProgram_Args();
execArgs.KFilenameList.Add("path/to/kcl.k");
var result = new API().ExecProgram(execArgs);
Console.WriteLine(result.YamlResult);
}
}

更多其他 SDK 安装和使用方式详见:https://github.com/kcl-lang/lib

多语言插件更新

KCL 多语言插件新增至 3 个,目前主要支持 Go, Python 和 Java, 仅需要基础的 SDK 依赖,可以实现通用语言和 KCL 的无缝互操作,下面以 Python 和 Java 插件为例

编写如下 KCL 代码 (main.k)

import kcl_plugin.my_plugin

result = my_plugin.add(1, 1)

使用 Python SDK 注册 Python 函数实现在 KCL 中调用

import kcl_lib.plugin as plugin
import kcl_lib.api as api

plugin.register_plugin("my_plugin", {"add": lambda x, y: x + y})

def main():
result = api.API().exec_program(
api.ExecProgram_Args(k_filename_list=["main.k"])
)
assert result.yaml_result == "result: 2"

main()

使用 Java SDK 注册 Java 函数实现在 KCL 中调用

package com.kcl;

import com.kcl.api.API;
import com.kcl.api.Spec.ExecProgram_Args;
import com.kcl.api.Spec.ExecProgram_Result;

import java.util.Collections;

public class PluginTest {
public static void main(String[] mainArgs) throws Exception {
API.registerPlugin("my_plugin", Collections.singletonMap("add", (args, kwArgs) -> {
return (int) args[0] + (int) args[1];
}));
ExecProgram_Result result = new API()
.execProgram(ExecProgram_Args.newBuilder().addKFilenameList("main.k").build());
System.out.println(result.getYamlResult());
}
}

更多其他多语言插件使用方式详见:https://www.kcl-lang.io/docs/reference/plugin/overview

此外,可以在这里找到更多的关于 KCL 多语言插件使用的真实用例

🌐 其他资源

🔥 查看 KCL 社区 加入我们 🔥

更多其他资源请参考: