Apple ha creat una implementació de codi obert del llenguatge de configuració Pkl, que promou un model de configuració com a codi. El conjunt d'eines relacionat amb Pkl està escrit en Kotlin i publicat amb la llicència Apache. Els connectors per treballar amb codi en el llenguatge Pkl estan preparats per als entorns de desenvolupament IntelliJ, Visual Studio Code i Neovim. S'espera la publicació del gestor LSP (Language Server Protocol) en un futur proper.
Pkl combina les propietats d'un llenguatge declaratiu fàcil d'entendre amb les característiques avançades dels llenguatges de propòsit general. El llenguatge admet anotacions de tipus, classes, funcions, expressions computacionals, condicions i bucles. Pkl es pot utilitzar tant per generar configuracions estàtiques en diversos formats, com JSON, YAML i XML, com per generar mòduls per processar formats de configuració especificats en aplicacions en diversos llenguatges de programació.
Els enllaços per integrar Pkl a les aplicacions estan preparats per a Java, Kotlin, Go i Swift. Es proposa per separat un mòdul per a la integració amb el marc Spring. Els enllaços permeten, en funció de la configuració en el llenguatge Pkl, crear paquets i mòduls ja fets amb classes per treballar amb la configuració descrita a l'aplicació. Els paquets de configuració es poden publicar als repositoris i importar-los com a dependències, permetent que el codi Pkl es comparteixi entre diferents projectes.
El llenguatge proporciona eines flexibles per definir condicions i comprovar la correcció dels valors, la qual cosa us permet identificar errors en la configuració final abans que s'utilitzi a l'aplicació. Per exemple, podeu definir l'interval vàlid de valors ("port: Int(this > 1000)" o "edat: Int(isBetween(0, 130))"), si és necessari o no, i el format ("zipCode: String(coincideix(Regex("\\d{5}")))"). Si assigneu un valor que no compleix la condició, el validador llançarà un error (per exemple, si intenteu assignar el valor 1001 a un paràmetre definit com a "Int(this > 1000)").
Per exemple, en l'idioma Pkl podeu escriure el mòdul Application.pkl amb una plantilla de configuració per connectar-vos a un DBMS: mòdul Nom d'amfitrió de l'aplicació: Port de cadena: Entorn UInt16: Base de dades d'entorn: Classe de base de dades Base de dades { nom d'usuari: Contrasenya de cadena: Amfitrió de cadena: Port de cadena: UInt16 dbName: String } typealias Environment = "dev"|"qa"|"prod"
A continuació, podeu crear directament un fitxer de configuració que utilitzi aquest mòdul per comprovar la correcció dels valors: modifica "Application.pkl" hostname = "localhost" port = 3599 environment = "dev" database { host = "localhost" port = 5786 nom d'usuari = contrasenya "administrador" = lectura ("env:DATABASE_PASSWORD") dbName = "la mevaaplicació"}
I també escriu un generador per automatitzar el canvi del número de port per a quatre DBMS diferents: importar "Application.pkl" base de dades oculta: Application.Database = new { host = "localhost" username = "admin" password = read ("env:DATABASE_PASSWORD" ) dbName = "la meva aplicació" } sidecars { per (desplaçament a la llista (0, 1, 2, 3)) { (db) { port = 6000 + desplaçament } } }
Si ho desitja, podeu exportar la configuració en un format diferent, per exemple, YAML: sidecars: - nom d'usuari: contrasenya d'administrador: host hunter2: port localhost: 6000 dbName: myapp - nom d'usuari: contrasenya administrador: hunter2 host: port localhost: 6001 dbName : myapp - nom d'usuari: contrasenya d'administrador: host hunter2: port localhost: 6002 dbName: myapp — nom d'usuari: contrasenya administrador: host hunter2: port localhost: 6003 dbName: myapp
El diagrama de configuració de Pkl també es pot convertir en classes o estructures per incrustar-les al codi de l'aplicació. Per exemple, podeu generar una vinculació per a Kotlin: import kotlin.Int import kotlin.Long import kotlin.String classe de dades Aplicació (val hostname: String, val port: Int, val environment: Environment, val database: Database ) { data class Base de dades (val nom d'usuari: String, val password: String, val host: String, val port: Int, val dbName: String) classe d'enumeració Environment (val value: String) { DEV("dev"), QA("qa") , PROD( "prod"); anul·lar fun toString() = valor } }
Font: opennet.ru
