Въведение

Екипът на KCL има удоволствието да съобщи, че KCL v0.4.5 вече е наличен! Тази версия е насочена главно към подобряване на удобството и стабилността на писане на KCL език, подобряване на информацията за грешки и поддръжка на повече платформи, включително версия на Windows и повече методи за изтегляне. В KCL v0.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 v0.4.5 ще избягваме извеждането на тази грешка, след като поддържаме мързеливата ненулева валидност на атрибута на схемата. Тоест, когато spec.value="value" и spec.id=1 на атрибутите config се обединят, всички атрибути на config ще бъдат проверени рекурсивно за ненулеви. В този момент всички стойности на атрибута spec са напълно присвоени (стойността на атрибута id на spec е 1, а атрибутът value е "value"), грешката, че необходимият атрибут на схемата е нула, няма да бъде изведена.

Следователно, след 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 v0.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 v0.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 Playground

В тази актуализация актуализирахме версията на KCL playground и поддържаме автоматичното компилиране и форматиране на KCL код. Можете да посетите уебсайта на KCL и да щракнете върху бутона на детската площадка, за да го изпитате.

В следващите версии на KCL ще продължим да актуализираме игралната площадка на KCL, за да поддържаме повече възможности, като избор на версия на KCL и споделяне на код.

Още платформи и методи за изтегляне за KCL

Windows

Двоичната версия на 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 plug-in, трябва да се уверите, че 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 Издание #422.

Конфигуриране при несъответствие на типа на израза оптимизация на грешка

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

Преди KCL v0.4.5, за `configuration if express`, изпълнението на горния код ще получи очакваната конфигурационна стойност, което ще доведе до проблем с несъстоятелността на типа, тъй като KCL компилаторът неправилно проверява дали стойността "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 Издание #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 v0.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 Schema Helm и осигурете KCL SDK за инструмента kpt.
  • Издаване на KCL инструмент за управление на пакети, наречен KPM. Очаква се да поддържа конфигурация и актуализация на зависимостта на Git repo код, изтегляне на код и други основни възможности.
  • KCL Playground: Поддържайте споделяне на код и избор на версия на KCL.
  • KCL Go SDK: Повече поддръжка на възможности, като например поддръжка на двупосочното преобразуване на KCL схемата и Go структурата
  • KCL Python SDK: Повече поддръжка на възможности.

За повече подробности, моля, вижте KCL v0.4.6 Milestone

ЧЗВ

За повече информация вижте KCL ЧЗВ.

Допълнителни ресурси

Благодарим на всички потребители на KCL за техните ценни отзиви и предложения по време на пускането на тази версия. За повече ресурси, моля, вижте:

Вижте общността за начини да се присъедините към нас. 👏👏👏