Введение

Команда KCL рада сообщить, что KCL v0.4.5 теперь доступен! Этот выпуск в основном направлен на повышение удобства и стабильности написания на языке KCL, улучшение информации об ошибках и поддержку большего количества платформ, включая версию для Windows, и дополнительные методы загрузки. В KCL версии 0.4.5 пользователи могут отказаться от большего количества шаблонов конфигурации, написав меньше кодов KCL. В новой версии предусмотрена предварительная поддержка KCL Playground, которую можно использовать для написания и запуска кода KCL онлайн без установки. Кроме того, этот выпуск также включает множество оптимизаций информации об ошибках компилятора и исправления ошибок.

Вы можете посетить страницу выпуска KCL или веб-сайт KCL, чтобы получить ссылку для загрузки двоичного файла KCL и более подробную информацию о выпуске.

KCL — это открытый, основанный на ограничениях язык записи и функциональный язык. KCL упрощает написание многочисленных сложных конфигураций, таких как облачные сценарии, благодаря своей зрелой технологии языка программирования и практике. Он предназначен для создания лучшей модульности, масштабируемости и стабильности конфигураций, более простого написания логики, более быстрой автоматизации и отличных встроенных интеграций или интеграций на основе API.

Этот блог будет знакомить читателей с содержанием KCL v0.4.5 и последними разработками в сообществе KCL.

Особенности

Улучшение удобства написания языка

Ленивая проверка ненулевых атрибутов в схеме KCL

В предыдущих версиях KCL мы поддерживали возможности ленивой оценки и проверки перекрестных ссылок атрибутов схемы (включая наследование) и проверочных выражений. В этой версии мы поддержали дополнительные возможности отложенной оценки схемы, такие как отложенная проверка ненулевого атрибута схемы. Например, для следующих кодов KCL:

schema Spec:
    id: int
    value: str

schema Config:
    name?: str
    spec: Spec = Spec {  
        id = 1
    } # Before KCL v0.4.5, this statement will report an attribute non-null error. After v0.4.5, the schema non-null attribute lazy validation is supported

config = Config {
    spec.value = "value"
}

До версии KCL v0.4.5 непосредственное выполнение приведенного выше кода выдавало ошибку, что атрибут value элемента spec не может быть None в блоке операторов spec: Spec=Spec { элемента schema Config, так как только атрибуту id элемента spec присвоено значение 1, а значение отсутствует. присваивается атрибуту value элемента spec.

После KCL версии 0.4.5 мы будем избегать появления этой ошибки после поддержки возможности ленивой ненулевой проверки атрибута схемы. То есть, когда spec.value="value" и spec.id=1 атрибутов config объединяются, все атрибуты config будут рекурсивно проверяться на ненулевые значения. В это время все значения атрибута spec полностью назначены (значение атрибута id для spec равно 1, а атрибута value равно "value"), ошибка о том, что требуемый атрибут схемы имеет значение null, не будет выдана.

Поэтому после KCL v0.4.5 и выполнения приведенного выше кода KCL мы получим полный вывод YAML следующим образом:

config:
  spec:
    id: 1
    value: value

Взаимная ссылка атрибутов блока конфигурации

В версиях до v0.4.5 KCL еще не поддерживал взаимную ссылку атрибутов в блоке конфигурации, что приводило к необходимости определять дополнительные переменные конфигурации или шаблоны для ссылки в некоторых сценариях, что приводило к большему количеству шаблонов конфигурации и повторяющихся кодов, таких как код KCL, показанный ниже:

name = "app-name"
data = {
    name = name`
    metadata.name = name  # `metadata.name` cannot directly reference the `name` attribute inside the `data` configuration.
}

Атрибут metadata.name блока конфигурации data не может напрямую ссылаться на атрибут name внутри блока data. Нам нужно определить дополнительную глобальную переменную name для справки.

Начиная с KCL версии 0.4.5, мы поддерживаем функцию взаимной ссылки атрибутов блока конфигурации, которую можно использовать для исключения дополнительных шаблонов конфигурации, таких как код KCL, показанный ниже:

data = {
    name = "app-name"
    metadata.name = name  # Directly reference the name attribute of the `data` configuration
}

Атрибут metadata.name блока конфигурации data может напрямую ссылаться на атрибут name внутри data без определения дополнительных глобальных переменных.

Следующий вывод YAML можно получить, выполнив приведенный выше код KCL:

data:
  name: app-name
  metadata:
    name: app-name

Вот более сложный пример:

name = "global-name"
metadata = {
    name = "metadata-name"
    labels = {
        "app.kubernetes.io/name" = name  # Directly reference `metadata.name`
        "app.kubernetes.io/instance" = name  # Directly reference `metadata.name`
    }
}
data = {
    name = name  # Reference the global variable `name`
    metadata = metadata  # Reference global variables `metadata`
    spec.template.metadata.name = metadata.name  # Reference `metadata` variables inside `data`.
}

Выполнив приведенный выше код, можно получить следующий вывод YAML:

name: global-name
metadata:
  name: metadata-name
  labels:
    app.kubernetes.io/name: metadata-name
    app.kubernetes.io/instance: metadata-name
data:
  name: global-name
  metadata:
    name: metadata-name
    labels:
      app.kubernetes.io/name: metadata-name
      app.kubernetes.io/instance: metadata-name
  spec:
    template:
      metadata:
        name: metadata-name

Примечание. Текущая версия KCL не поддерживает обратную ссылку на внутренние атрибуты блока конфигурации и прямую ссылку на глобальные переменные за счет пропуска внутренней области. Ссылочные атрибуты должны быть записаны перед ссылкой на конфигурацию.

Новые языковые возможности

Форматирование индекса функции-члена формата строки

Начиная с KCL версии 0.4.5, KCL поддерживает использование формата стиля тега индекса <format_ele_index>[<index_or_key>] в блоке формата {} для переменных KCL типов списка и словаря, подобных языку Python.

  • <format_ele_index> указывает индекс, необходимый для сериализации элементов списка и словаря.
  • <index_or_key> указывает индекс подэлемента списка или ключевое значение подэлемента словаря соответствующего элемента списка и типа словаря.

Например, для следующего кода KCL

# 0[0] means taking the 0th element of ["Hello", "World"]: "Hello"
# 0[1] means taking the 1th element of ["Hello", "World"]: ""World"
listIndexFormat = "{0[0]}{0[1]}".format(["Hello", "World"])
# 0[0] means taking the 0th element of ["0", "1"]: "0"
# 1[Hello] means taking {"Hello": "World"} dictionary element whose key value is Hello: "World"
dictIndexFormat = "0{0[0]}, 1{0[1]}, Hello{1[Hello]}".format(["0", "1"], {"Hello": "World"})

Выполнив приведенный выше код, можно получить следующий вывод YAML:

listIndexFormat: HelloWorld
dictIndexFormat: "00, 11, HelloWorld"

KCL Детская площадка

В этом обновлении мы обновили версию игровой площадки KCL и поддерживаем автоматическую компиляцию и форматирование кода KCL. Вы можете посетить веб-сайт KCL и нажать кнопку игровой площадки, чтобы испытать его.

В последующих версиях KCL мы продолжим обновлять игровую площадку KCL, чтобы поддерживать больше возможностей, таких как выбор версии KCL и совместное использование кода.

Другие платформы и способы загрузки для KCL

Окна

Бинарную версию KCL для Windows теперь можно скачать с Github вручную. После загрузки добавьте {install_location}\kclvm\bin в переменную окружения PATH.

$env:PATH += ";{install-location}\kclvm\bin;"

Кроме того, вы также можете установить KCL с помощью сценария Powershell, показанного ниже:

powershell -Command "iwr -useb https://kcl-lang.io/script/install.ps1 | iex"

В будущем мы будем поддерживать больше методов загрузки для управления пакетами Windows, например Scoop.

Другие способы загрузки

В этом обновлении версии мы поддерживаем больше методов загрузки KCL, включая сценарии, Python, Go, Homebrew и установку Docker одним щелчком мыши. Для получения более подробной информации см. раздел Загрузка и установка KCL. В будущем мы будем поддерживать другие методы установки KCL.

⚠️ Примечание. Для всех вышеперечисленных операционных систем и методов установки, если вы хотите использовать подключаемый модуль KCL Python, вам необходимо убедиться, что установлен Python 3.7+, и добавить команду python3 в переменную среды PATH.

Исправление

Порядок слияния конфигурации неверен, когда существует правильное значение ненастроенного выражения

schema Resource:
    cpu: int
    memory: str

schema Config:
    resource: Resource

r = Resource {
    cpu = 4
    memory = "8Gi"
}

config: Config {
    resource: Resource {
        cpu = 2
        memory = "4Gi"
    }
}

config: Config {
    resource: r
}

До версии KCL v0.4.5 выполнение приведенного выше кода (main.k) приводило к неожиданным значениям конфигурации, поскольку компилятор KCL неправильно оптимизировал следующую форму эквивалентных блоков конфигурации слияния:

config: Config {
    resource: r
    resource: Resource {
        cpu = 2
        memory = "4Gi"
    }
}

После KCL v0.4.5 исправлена ​​некорректная настройка порядка слияния. Вы можете выполнить main.k и получить ожидаемый результат YAML:

r:
  cpu: 4
  memory: 8Gi
config:
  resource:
    cpu: 4
    memory: 8Gi

Для получения дополнительной информации см. KCL Issue #422.

Настройте оптимизацию при ошибке несоответствия типа выражения

config: {"A"|"B": int} = {
    if True:
        A = "2"
}

До версии KCL v0.4.5 для `configuration if expression` при выполнении приведенного выше кода будет получено ожидаемое значение конфигурации, что приведет к проблеме несоответствия типа, поскольку компилятор KCL неправильно проверяет, не соответствует ли значение "2" атрибута A значению "2" атрибута A заявленный тип int. После KCL v0.4.5 эта проблема была исправлена. Вы можете выполнить приведенный выше код, чтобы получить ожидаемую ошибку несоответствия типов:

KCL Compile Error[E2G22] : The type got is inconsistent with the type expected
---> File main.k:1:1
1 |config: {"A"|"B": int} = {
 1 ^  -> got {str(A):str(2)}
expect {str(A)|str(B):int}, got {str(A):str(2)}

Для получения дополнительной информации см. KCL Issue #389.

Проверка утверждения правила не работает

В предыдущих версиях KCL при использовании следующего кода правила (main.k) код ограничения ServiceCheckRule не вступал в силу.

protocol KubeResourceProtocol:
    svc: Service

schema Service:
    name: str

rule ServiceCheckRule for KubeResourceProtocol:
    svc.name != "name"

svc = Service {
    name = "name"
}

ServiceCheckRule {
    svc = svc
}

После улучшения мы выполняем приведенный выше код и получаем точную ошибку отказа проверки:

KCL Runtime Error[E3B17] : Schema check is failed to check condition
---> File main.k:14
14 |ServiceCheckRule { -> Instance check failed
    ---> File main.k:8
    8 |    svc.name != "name" -> Check failed on the condition
Check failed on check conditions

Оптимизация вывода типа атрибута блока конфигурации

schema Id:
    id?: int = 1

schema Config:
    data?: {"A"|"B": Id}

c = Config {
    data = {
        A = Id()  # Before v0.4.5, we will get a type mismatch error here.
        B = Id()
    }
}

До версии KCL v0.4.5 выполнение приведенного выше кода приводило к неожиданному несоответствию типов, поскольку компилятор KCL неправильно выводил тип атрибута c.data.A к типу str, что приводило к ошибке несоответствия с типом объединения строковых литералов "A"|"B". После обновления KCL v0.4.5 эта проблема была исправлена, и ожидаемый результат YAML можно было получить, выполнив приведенный выше код:

c:
  data:
    A:
      id: 1
    B:
      id: 1

Оператор присваивания использует оптимизацию ошибок аннотации типа схемы

schema Foo:
    foo: int

schema Bar:
    bar: int

foo: Foo = Bar {  # Before v0.4.5, we will get a runtime type mismatch error here
    bar: 1
}

До версии KCL v0.4.5 выполнение приведенного выше кода приводило к ошибке несоответствия типа во время выполнения. После обновления версии ошибка несоответствия этого типа будет оптимизирована для времени компиляции, а ошибка будет перемещена влево, чтобы найти этот тип ошибки раньше.

Ошибка типа модуля KCL с символом ?. оператор

import math

data = math?.log(10)  # Before v0.4.5, we will get an unexpected 'math is not defined' error here

До KCL версии 0.4.5 выполнение приведенного выше кода приводило к неожиданной ошибке неопределенной переменной, поскольку компилятор KCL неправильно обрабатывает тип модуля math, а операторы ?. используются в комбинации. После KCL v0.4.5 такие проблемы исправлены.

Другие обновления и проблемы

Дополнительные обновления и исправления ошибок смотрите здесь

Документы

На сайт KCL добавлена ​​семантическая опция управления версиями. В настоящее время поддерживаются версии v0.4.3, v0.4.4 и v0.4.5.

Сообщество

  • Два внешних участника @thinkrapido и @Rishav1707 приняли участие в сообществе KCL, спасибо им за их энтузиазм и активное участие в содействии.
  • Спасибо @Rishav1707 за создание Rust-версии подпроекта kcl-loader-rs на основе KCL, который поддерживает автоматическое создание структуры Rust в соответствии со схемой и определением конфигурации в файле KCL, а также функцию десериализации из значения KCL в Значение структуры ржавчины.

Далее

Ожидается, что в середине апреля 2023 года мы выпустим KCL v0.4.6. Ожидаемая ключевая эволюция включает в себя:

  • Язык KCL дополнительно совершенствуется для удобства, пользовательский интерфейс постоянно оптимизируется и улучшается опыт, а поддержка пользователей и проблемы решаются.
  • Новая версия языкового сервера KCL и языкового плагина VSCode, производительность которого, как ожидается, увеличится в 20 раз, и ожидается, что он будет поддерживать основные базовые возможности, такие как предупреждение о коде и подсказка об ошибке с помощью волнистой линии, переход, поиск ссылок. , и т. д.
  • Постоянно улучшайте языковые возможности для устранения болевых точек сценариев управления конфигурацией Kubernetes Manifests. Например, спроектируйте и предоставьте подключаемый модуль схемы KCL Helm и предоставьте KCL SDK для инструмента kpt.
  • Инструмент управления пакетами KCL под названием KPM)выпуск. Ожидается, что он будет поддерживать настройку и обновление зависимостей кода репозитория Git, загрузку кода и другие базовые возможности.
  • KCL Playground: поддержка совместного использования кода и выбора версии KCL.
  • KCL Go SDK: поддержка дополнительных возможностей, таких как поддержка двунаправленного преобразования схемы KCL и структуры Go.
  • KCL Python SDK: поддержка дополнительных возможностей.

Подробнее см. в KCL v0.4.6 Milestone.

Часто задаваемые вопросы

Для получения дополнительной информации см. Часто задаваемые вопросы о KCL.

Дополнительные ресурсы

Спасибо всем пользователям KCL за их ценные отзывы и предложения во время выпуска этой версии. Для получения дополнительных ресурсов см.:

Смотрите сообщество для способов присоединиться к нам. 👏👏👏