Apple pubblica Pkl, un linguaggio di programmazione di configurazione

Apple ha reso open source un'implementazione del linguaggio di configurazione Pkl, che promuove il modello di configurazione come codice. Il toolkit relativo a Pkl è scritto in Kotlin e pubblicato sotto la licenza Apache. I plugin per lavorare con il codice nel linguaggio Pkl sono preparati per gli ambienti di sviluppo IntelliJ, Visual Studio Code e Neovim. Nel prossimo futuro è prevista la pubblicazione dell'handler LSP (Language Server Protocol).

Pkl combina le proprietà di un linguaggio dichiarativo di facile comprensione con le funzionalità avanzate dei linguaggi di uso generale. Il linguaggio supporta annotazioni di tipo, classi, funzioni, espressioni computazionali, condizioni e loop. Pkl può essere utilizzato sia per generare configurazioni statiche in vari formati, come JSON, YAML e XML, sia per generare moduli per l'elaborazione di formati di configurazione specifici in applicazioni in vari linguaggi di programmazione.

I collegamenti per l'integrazione di Pkl nelle applicazioni sono preparati per Java, Kotlin, Go e Swift. Viene proposto separatamente un modulo per l'integrazione con il framework Spring. I collegamenti consentono, in base alla configurazione nel linguaggio Pkl, di creare pacchetti e moduli già pronti con classi per lavorare con la configurazione descritta nell'applicazione. I pacchetti di configurazione possono essere pubblicati nei repository e importati come dipendenze, consentendo la condivisione del codice Pkl tra diversi progetti.

Il linguaggio fornisce strumenti flessibili per definire le condizioni e verificare la correttezza dei valori, consentendo di identificare gli errori nella configurazione finale prima che venga utilizzata nell'applicazione. Ad esempio, puoi definire l'intervallo di valori valido (“port: Int(this > 1000)” o “age: Int(isBetween(0, 130))”), se è obbligatorio o meno e il formato ("zipCode: String(matches(Regex( "\\d{5}")))"). Se assegni un valore che non soddisfa la condizione, il validatore genererà un errore (ad esempio, se provi ad assegnare il valore 1001 a un parametro definito come "Int(this > 1000)").

Ad esempio, nel linguaggio Pkl è possibile scrivere il modulo Application.pkl con un modello di configurazione per la connessione a un DBMS: modulo Nome host applicazione: String porta: UInt16 ambiente: Database ambiente: Classe database Database { nome utente: String password: String host: Porta stringa: UInt16 dbName: String } typealias Ambiente = "dev"|"qa"|"prod"

Successivamente è possibile creare direttamente un file di configurazione che utilizza questo modulo per verificare la correttezza dei valori: amends “Application.pkl” hostname = “localhost” port = 3599 Environment = “dev” database { host = “localhost” port = 5786 nome utente = "admin" password = read("env:DATABASE_PASSWORD") dbName = "miaapp" }

E scrivi anche un generatore per automatizzare la modifica del numero di porta per quattro diversi DBMS: import “Application.pkl” hidden db: Application.Database = new { host = “localhost” nome utente = “admin” password = read(“env:DATABASE_PASSWORD” ) dbName = "miaapp" } sidecar { for (offset in List(0, 1, 2, 3)) { (db) { porta = 6000 + offset } } }

Se lo si desidera, è possibile esportare la configurazione in un formato diverso, ad esempio YAML: sidecars: - nome utente: admin password: Hunter2 host: localhost porta: 6000 dbName: myapp - nome utente: admin password: Hunter2 host: localhost porta: 6001 dbName : miaapp - nome utente: password amministratore: host Hunter2: porta localhost: 6002 dbName: miaapp - nome utente: password amministratore: host Hunter2: porta localhost: 6003 dbName: miaapp

Il diagramma di configurazione Pkl può anche essere convertito in classi o strutture da incorporare nel codice dell'applicazione. Ad esempio, puoi generare un'associazione per Kotlin: import kotlin.Int import kotlin.Long import kotlin.String data class Application( val hostname: String, val port: Int, val ambiente: Environment, val database: Database ) { data class Database( val nome utente: String, val password: String, val host: String, val port: Int, val dbName: String ) enum class Environment( val valore: String ) { DEV("dev"), QA("qa") ,PROD("prod"); sovrascrivi fun toString() = valore } }

Fonte: opennet.ru

Aggiungi un commento