Apple publiceert Pkl, een programmeertaal voor configuratie

Apple heeft de programmeertaal Pkl open source gemaakt. Deze taal is ontworpen om configuratie te definiëren en promoot het 'configuratie als code'-model. De Pkl-gerelateerde toolkit is geschreven in Kotlin en gepubliceerd onder de Apache-licentie. Plugins voor het werken met Pkl-code zijn voorbereid voor de ontwikkelomgevingen IntelliJ, Visual Studio Code en Neovim. Een LSP-handler (Language Server Protocol) wordt binnenkort verwacht.

Pkl combineert de eigenschappen van een eenvoudig te begrijpen declaratieve taal met de geavanceerde mogelijkheden van algemene talen. De taal ondersteunt type-annotaties, klassen, functies, computationele expressies, voorwaarden en lussen. Pkl kan zowel worden gebruikt om statische configuraties te genereren in verschillende formaten, zoals JSON, YAML en XML, als om modules te vormen voor de verwerking van specifieke configuratieformaten in applicaties in diverse programmeertalen.

Bindings voor de integratie van Pkl in applicaties zijn beschikbaar voor Java, Kotlin, Go en Swift. Een module voor integratie met het Spring-framework wordt apart aangeboden. Bindings maken het mogelijk om, op basis van de configuratie in de Pkl-taal, kant-en-klare pakketten en modules met klassen te vormen voor het werken met de beschreven configuratie in de applicatie. Pakketten met een configuratiebeschrijving kunnen in repositories worden gepubliceerd en als afhankelijkheid worden geïmporteerd, wat gedeeld gebruik van Pkl-code tussen verschillende projecten mogelijk maakt.

De taal biedt flexibele mogelijkheden voor het definiëren van voorwaarden en het controleren van de juistheid van waarden, zodat u fouten in de uiteindelijke configuratie kunt detecteren voordat deze op de applicatie wordt toegepast. U kunt bijvoorbeeld een acceptabel bereik van waarden definiëren ("poort: Int(this > 1000)" of "leeftijd: Int(isBetween(0, 130))"), verplichte of optionele vulling, en formaat ("postcode: String(matches(Regex("\\d{5}")))"). Als een waarde wordt toegewezen die niet aan de voorwaarde voldoet, geeft de validator een foutmelding weer (bijvoorbeeld bij een poging om de waarde 1001 toe te wijzen aan een parameter die is gedefinieerd als "Int(this > 1000)").

U kunt bijvoorbeeld in de Pkl-taal de Application.pkl-module schrijven met een DBMS-verbindingsconfiguratiesjabloon: module Application hostname: String port: UInt16 environment: Environment database: Database class Database { username: String password: String host: String port: UInt16 dbName: String } typealias Environment = «dev»|»qa»|»prod»

Vervolgens kunt u rechtstreeks een configuratiebestand maken dat deze module gebruikt om te controleren of de waarden correct zijn: amends "Application.pkl" hostname = "localhost" port = 3599 environment = "dev" database { host = "localhost" port = 5786 username = "admin" password = read("env:DATABASE_PASSWORD") dbName = "myapp" }

En schrijf ook een generator om het wijzigen van het poortnummer voor vier verschillende DBMS'en te automatiseren: import "Application.pkl" hidden db: Application.Database = new { host = "localhost" username = "admin" password = read("env:DATABASE_PASSWORD") dbName = "myapp" } sidecars { for (offset in List(0, 1, 2, 3)) { (db) { port = 6000 + offset } } }

Indien gewenst, kunt u de configuratie exporteren in een ander formaat, bijvoorbeeld YAML: sidecars: — gebruikersnaam: admin wachtwoord: hunter2 host: localhost poort: 6000 dbName: myapp — gebruikersnaam: admin wachtwoord: hunter2 host: localhost poort: 6001 dbName: myapp — gebruikersnaam: admin wachtwoord: hunter2 host: localhost poort: 6002 dbName: myapp — gebruikersnaam: admin wachtwoord: hunter2 host: localhost poort: 6003 dbName: myapp

Het Pkl-configuratieschema kan ook worden omgezet naar klassen of structuren voor inbedding in applicatiecode. U kunt bijvoorbeeld een binding voor Kotlin genereren: import kotlin.Int import kotlin.Long import kotlin.String data class Application( val hostname: String, val port: Int, val environment: Environment, val database: Database ) { data class Database( val username: String, val password: String, val host: String, val port: Int, val dbName: String ) enum class Environment( val value: String ) { DEV(«dev»), QA(«qa»), PROD(«prod»); override fun toString() = value } }

Bron: opennet.ru

Koop betrouwbare hosting voor sites met DDoS-bescherming, VPS VDS-servers 🔥 Koop betrouwbare websitehosting met DDoS-bescherming, VPS- en VDS-servers | ProHoster