Skip to main content

1 post tagged with "KCL"

查看所有标签

· 阅读需要 1 分钟

简介​

KCL 团队很高兴地宣布 KCL v0.13.0 新版本现已可用!本次发布为大家带来了三个方向的更新:

  • 更一致、更具表达力的 KCL 语言:ES6 风格配置项简写、更灵活的 Lambda 表达式、更友好的多行字符串以及更完善的相等性语义
  • 更完善的标准库与跨语言 API:新增 reduce、json.merge、file.readbase64 与 net.is_IPv6 等函数,支持 RFC 7396 JSON Merge Patch,Source Map v3 输出以及行级测试覆盖率
  • 更快、更可靠的工具链与 IDE:显著提升编译与求值性能,提供包级 lint、dry-run 格式化以及更丰富的 LSP 能力

KCL 是一个由 CNCF(云原生计算基金会)托管的、基于约束的记录与函数式语言。它借助成熟的编程语言技术和工程实践,改善云原生等复杂配置场景下的编写体验,致力于围绕配置构建更好的模块化、扩展性与稳定性,让逻辑编写更简单、自动化更顺畅,并提供丰富的内置与 API 驱动的集成能力。

❤️ 特别鸣谢​

衷心感谢 v0.12 → v0.13 版本迭代过程中所有社区贡献者,以下排名不分先后。

@Peefy, @zong-zhe, @liangyuanpeng, @johngmyers, @priyansh-saxena1, @jfharden, @aliazlan4, @vlada-dudr, @turner-hemmer, @Arpit529Srivastava, @DCchoudhury15, @jschoone, @ytsarev, @f4z3r, @rtainaan, @31puneet, @Viscous106, @56steve, @neo0007777

📚 重点更新内容​

🔧 核心功能​

语言​

  • KCL 支持 ES6 风格的配置项简写:在 config / schema 字面量中,单独的标识符等价于 key = key,可以与普通条目混合书写。例如 { name, age = 18 } 等价于 { name = name, age = 18 }。
  • Lambda 表达式支持使用花括号包裹参数列表,参数因此可以写在多行。使用花括号时必须显式声明返回类型。
func = lambda {
x: int,
y: int = 5
} -> int {
x + y
}
  • 多行(三引号)字符串会自动去除公共缩进:会剥离所有非空行的公共前导空白,使内嵌文本可以跟随外层代码自然缩进。
s = """
foo
bar
""" # "foo\nbar\n"
  • != 运算符现在除了基础类型外,也支持列表、字典与 schema 进行比较,例如 {} != {k = "v"} 与 [0] != [1]。
  • 量词表达式(all / any / filter / map)支持以选择子表达式作为迭代目标,包括安全导航选择子,因此可以直接迭代嵌套集合,例如 all y in data?.items { y > 0 }。
  • YAML 输出可通过新的 multiline_string 编码选项选用 多行 block-scalar 字符串,并保留 YAML block-scalar 的尾部换行。
  • 修正 math.floor 返回整数而非浮点数。
  • 修正字符串格式化,使 宽度、对齐与填充 说明符作用于字符串值,例如 "{:*^10}".format("hi") 得到 "****hi****"。
  • 修复了与 lazy scope 缓存、schema 属性 override、mixin replay、前向引用以及 config 条目遮蔽外层 schema 属性相关的一系列求值问题,使求值结果更加稳定、可预期。

工具链​

  • kcl lint ./...:lint 命令现支持 ./... 模式,可一次性对当前目录或指定目录下的所有 KCL 包执行 lint,每个目录对应一个包,类似 go build ./...。
  • kcl fmt --dry-run:在不修改文件的前提下报告需要格式化的文件,便于在 CI 中进行检查。格式化器同时会遵守 .editorconfig 中的缩进设置,保留同一行上的行尾注释,并在解析失败时保持源码不变。
  • kcl test 提供行级覆盖率:测试 API 会按文件收集测试运行的行级覆盖率信息。
  • 将 KCL 程序打包为单文件 形式,便于分发和执行。
  • 性能:本次发布带来一系列显著的性能改进 —— 编译器索引使用更快的哈希表、为配置键启用小字符串优化、用单调递增的 AST 索引替代 UUID、加载过程中缓存路径规范化与包解析、对全限定名查找做记忆化与增量更新,并跳过未使用包的编译步骤。在中大型项目上,编译与求值速度都有可感知的提升。
  • 发布产物覆盖更多平台,包括 Linux glibc 2.17 与 musl(Alpine Linux)构建。

IDE​

  • KCL 语言服务器可在每个测试函数上方的 CodeLens 点击直接运行单元测试。
  • 语言服务器可 通过 kcl mod 工具链自动更新依赖,并响应 kcl.mod / kcl.yaml 的修改事件。
  • 语言服务器会 向上回溯目录寻找 kcl.mod / kcl.yaml / kcl.work 工作区根,在工作区文件监听中遵守 .gitignore,并加快导入补全速度。
  • 修复了语言服务器中 schema 解析时继承属性查找错误、错误的导入补全以及缺失的 schema 类型恢复等问题。

API​

  • Source Map v3 输出:kcl run --sourcemap <file> 会随生成的 YAML 一并写入一份 Source Map v3 文档,使下游工具可以把生成出来的 YAML 行反查回源 .k 文件、所在行与列。
  • Schema 类型 API 扩展:KclType 现在携带 索引签名 与 函数类型 信息;为带 @info(type="attr") 装饰器的属性生成 __kcl_info_meta__ 标记。
  • 新增 GetSchemaTypeMappingUnderPath RPC:按包名返回 schema 类型映射。与 GetSchemaTypeMapping 不同的是,从外部依赖包导入的 schema 会以各自包名作为 key,而不是被拍平到 __main__ 下。
  • C API 支持 error_format 选项,提供机器可读的诊断输出格式(pretty、short、arcanist、sarif)。
  • ExecProgramArgs 支持仅使用 k_code_list 运行程序;当显式指定 --format 时,未请求的格式编码器会被跳过。

📦️ 标准库与三方库​

标准库​

  • 新增内建函数 reduce,对列表元素累积地施加归约函数。
reduce(lambda acc: int, item: int -> int { acc * item }, [2, 3, 4])  # 24
  • 新增 json 模块函数 merge,实现 RFC 7396 JSON Merge Patch。patch 中值为 None / Undefined 的键会被删除,字典按字段递归合并,其他值直接替换原值。
import json

result = json.merge({a = 1, b = {c = 2}}, {b = {c = None, d = 3}})
# {"a": 1, "b": {"d": 3}}
  • 新增 file 模块函数 readbase64,以原始字节读取文件并以 base64 字符串返回内容,可安全处理图片等非 UTF-8 文件。
  • 新增 net 模块函数 is_IPv6;to_IP16 重命名为 to_IP6,并修正对 IPv4-mapped IPv6 地址的转换。
  • datetime.now 接受可选的 ticks 参数,可用于格式化任意 epoch(自 Unix 纪元起的秒数),而不再仅限于当前时间;同时增强了 datetime 的日期校验。
  • 修复了 net.to_IP4 / to_IP6 的解析问题,并明确了 crypto 模块文档中说明的 UUID 版本。

三方库​

  • k8s 包在 1.14 - 1.31 之间收到了一系列补丁版本更新,并修正了 apimachinery 的 import alias。
  • external-secrets 升级到 2.9.0。
  • 更新了多个 Crossplane provider,包括 crossplane_provider_keycloak v2.24.1、crossplane-provider-kubernetes v1.2.1、crossplane-provider-openstack v0.10.0 以及 crossplane-provider-http v1.0.14(含 cluster / namespaced 结构)。
  • git-promoter 更新到 0.36.0。

☸️ 生态集成​

📖 文档更新​

  • 语言规范文档新增配置项简写、Lambda 参数花括号、多行字符串去缩进、列表/字典/Schema 上的 != 语义,以及选择子表达式作为量词迭代目标等说明。
  • 系统包参考文档新增 reduce、json.merge、file.readbase64、net.is_IPv6、net.to_IP6 与 datetime.now(ticks) 等函数说明。
  • 多语言 API 参考已与 v0.13.0 Protobuf 服务定义同步,包括 GetSchemaTypeMappingUnderPath 与测试覆盖率消息,并重新生成了 Go API 参考。
  • CLI 参考文档新增 kcl fmt 的 --dry-run 参数、kcl lint 的 ./... 模式,以及 kcl run 与 kcl vet 的最新参数与示例。

🌐 其他资源​

🔥 了解并加入 KCL 社区 🔥

更多资源请参考:

· 阅读需要 1 分钟

简介​

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

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

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

❤️ 特别鸣谢​

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

@adamwg, @steeling, @dennybaa, @liangyuanpeng, @NishantBansal2003, @mayrf, @eminaktas, @Gmin2, @tvandinther, @diefans, @nkabir, @suin, @Chewie, @lwz23, @eminaktas,@steeling, @bozaro, @cakemanny, @Yufeireal, @andrzejgorski, @yonas, @dansrogers, @SkySingh04, @jellllly420, @slashexx, @xnull, @diefans, @zflat, @vfarcic, @spastorclovr, @patpicos, @mproffitt, @fraenkel, @irizzant, @vfarcic, @patpicos, @mproffitt, @fraenkel, @Clint, @Christopher Haar, @ron18219, @Zack Zhang, @Alexander Fuchs, @Smaine Kahlouch, @Yvan da Silva, @Jakob Maležič, @Ryan Rueth, @Christopher Haar, @kesser, @Justin B, @Evgeny Shepelyuk, @Smaine Kahlouch, @KennyZ, @Mark Altmann (Wompi), @Peter Boat, @Hai Wu, @Evgeny Shepelyuk, @anshuman singh, @Carl-Fredrik, @Larry Gadallah, @Kevin Sztern, @Nick Atzert, @Tobias Kässer, @Mike, @john thompson, @Sky Singh, @suin, @Tom van Dinther, @Stefano Borrelli, @Valer Orlovsky, @Jacob Colvin, @Sjuul Janssen, @Vyacheslav Terdunov, @Yury Tsarev

📚 重点更新内容​

🔧 核心功能​

语言​

  • KCL 新增对 Alpine Linux(musl) 平台的支持。
  • KCL 重构了 Parser 部分的实现,重新组织了 import 依赖的 parse 流程。
  • KCL 优化了 schema attribute 中对 ** 表达式的类型解析。
  • KCL 修复了 lambda 表达式嵌套调用时不生效的问题。
  • KCL 修复了 schema mixin parse 内存泄露的问题。
  • KCL 修复了在有类型声明的赋值语句中函数调用表达式中的类型提升。
  • KCL 修复了 mixin 中调用 attr 的 lambda 函数的错误

工具链​

  • 包管理工具版本选择算法上线。在 v0.11.0 版本中, KCL 包管理工具支持对依赖图中出现的同一个三方库的不同版本号进行选择,KCL 包管理工具参考了 go mod 的 mvs 算法, 为了尽可能保证兼容性,包管理工具目前倾向于选择依赖图中出现的最新的版本而不是已经 release 的最新版本。 在 v0.11.0 版本中,版本选择默认关闭,通过设置环境变量 export KPM_FEATURE_GATES="SupportMVS=true" 控制是否开启版本选择。

  • 包管理工具新增了新的本地三方库缓存结构,在 v0.11.0 版本中,KCL 包管理工具实现了新的本地三方库缓存结构,新的存储缓存结构对下载 git 仓库性能平均提升 88%。 在 v0.11.0 版本中,新的缓存结构默认关闭,通过设置环境变量 export KPM_FEATURE_GATES="SupportNewStorage=true" 控制是否启用新的本地三方库缓存。

  • 修复 kcl fmt 代码注释的格式化错误。

  • 修复 kcl fmt 在处理行连接符和注释组合时的错误。

IDE​

  • KCL IntelliJ 插件发布 0.4.0 版本,支持 LSP4IJ
  • IDE 可以补全目录中未 import 的 schema,并且自动补充包的 import 语句 complete
  • IDE 新增了 Config 块中 key 的类型 hint。 hint
  • IDE schema hover 中提供了 attr 默认值信息。 hover
  • 修复了 IDE 在 Windows 系统中的异常。
  • 修复了 IDE 在复合赋值运算语句中异常的问题。
  • 区分了 any 关键字和类型的高亮
  • 修复了 IntelliJ 插件中格式化代码报错的问题。
  • 优化了 IDE 编译流程中 parser 部分。
  • 修复了函数参数 hint 不一致的问题。
  • 优化了 hint 信息,增加了双击将 hint 插入代码的功能。

API​

  • 新增了 kcl_run_with_log_message API
  • 新增了 kcl_exec_program capi
  • 为 wasm 添加 kcl_version api

📦️ 标准库及三方库​

标准库​

  • KCL 新增标准库函数 filesha512 和 fileblake3。
import crypto

sha_filesha512 = crypto.filesha512("test.txt")
sha_fileblake3 = crypto.fileblake3("test.txt")
  • 修复 manifests.yaml_stream 中 ignore_private=False 参数 不生效的问题。

三方库​

  • k8s 更新至 1.31.2
  • 修复 k8s 包中 import 别名的问题。
  • konfig 中增加 DeploymentStrategy 模型
  • helloworld 更新至 0.1.4
  • gateway 更新至 0.3.2
  • kubevirt 更新至 0.3.0
  • cert-manager 更新至 0.3.0
  • 新增 edp-keycloak-operator
  • 新增 sealed-secrets

☸️ 生态集成​

  • crossplane function-kcl 支持通过环境变量 FUNCTION_KCL_DEFAULT_SOURCE 设置默认编译环境入口。

📖 文档更新​

  • 修复 argocd kcl plugin 配置的示例代码中的错误
  • 新增了关于 plugin 相关的 FAQ 文档。
  • 新增了更多关于系统包相关的示例文档。
  • 新增了关于 json_merge_patch 相关的 FAQ 文档。
  • 新增了关于 isnullish 函数 相关的 FAQ 文档。
  • 新增了关于 oam app 继承相关的示例代码。
  • 修复了 Windows 安装脚本。
  • 修复了文档中部分 typo 和失效链接。
  • 更新了 KCL IntelliJ 插件的说明文档。

🌐 其他资源​

🔥 查看 KCL 社区 加入我们 🔥

更多其他资源请参考: