Apple malfermitkode publikigis la programlingvon Pkl, kiu estas desegnita por difini agordon kaj antaŭenigas la modelon "agordo kiel kodo". La Pkl-rilata ilaro estas skribita en Kotlin kaj publikigita sub la licenco Apache. Kromaĵoj por labori kun Pkl-kodo estis preparitaj por la evoluigaj medioj IntelliJ, Visual Studio Code kaj Neovim. Oni atendas baldaŭ publikigon de LSP (Language Server Protocol) traktilo.
Pkl kombinas la ecojn de facile komprenebla deklara lingvo kun la progresintaj kapabloj de ĝeneraluzeblaj lingvoj. La lingvo subtenas tipajn komentojn, klasojn, funkciojn, komputilajn esprimojn, kondiĉojn kaj buklojn. Pkl povas esti uzata kaj por generi statikajn konfiguraciojn en diversaj formatoj, kiel JSON, YAML kaj XML, kaj por formi modulojn por prilabori specifajn konfiguraciajn formatojn en aplikoj en diversaj programlingvoj.
Ligoj por integri Pkl en aplikaĵojn estas pretigitaj por Java, Kotlin, Go kaj Swift. Modulo por integriĝo kun la Spring-kadro estas aparte ofertita. Ligoj permesas, surbaze de la agordo en la lingvo Pkl, formi pretajn pakaĵojn kaj modulojn kun klasoj por labori kun la priskribita agordo en la aplikaĵo. Pakaĵoj kun agorda priskribo povas esti publikigitaj en deponejoj kaj importitaj kiel dependeco, kio ebligas la komunan uzon de Pkl-kodo inter malsamaj projektoj.
La lingvo provizas flekseblajn rimedojn por difini kondiĉojn kaj kontroli la ĝustecon de valoroj, permesante al vi detekti erarojn en la fina agordo antaŭ ol ĝi estas aplikita al la aplikaĵo. Ekzemple, vi povas difini akcepteblan intervalon de valoroj ("port: Int(this > 1000)" aŭ "age: Int(isBetween(0, 130))"), devigan aŭ laŭvolan plenigon, kaj formaton ("zipCode: String(matches(Regex("\\d{5}")))"). Se valoro estas asignita, kiu ne kongruas kun la kondiĉo, la validigilo montros eraron (ekzemple, kiam oni provas asigni la valoron 1001 al parametro difinita kiel "Int(this > 1000)").
Ekzemple, en la lingvo Pkl vi povas skribi la modulon Application.pkl kun ŝablono por agordo de konekto al DBMS: modulo Aplikaĵa gastnomo: String haveno: UInt16 medio: Medio datumbazo: Datumbazo klaso Datumbazo { uzantonomo: String pasvorto: String gastiganto: String haveno: UInt16 dbName: String } tipa kaŝnomo Medio = «dev»|»qa»|»prod»
Poste, vi povas rekte krei agordodosieron, kiu uzas ĉi tiun modulon por kontroli la ĝustecon de la valoroj: amends "Application.pkl" hostname = "localhost" port = 3599 environment = "dev" database { host = "localhost" port = 5786 username = "admin" password = read("env:DATABASE_PASSWORD") dbName = "myapp" }
Kaj ankaŭ skribu generatoron por aŭtomatigi la ŝanĝon de la pordnumero por kvar malsamaj DBMS-oj: 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 } } }
Se dezirite, vi povas eksporti la agordon en alia formato, ekzemple, YAML: sidecars: — username: admin password: hunter2 host: localhost port: 6000 dbName: myapp — username: admin password: hunter2 host: localhost port: 6001 dbName: myapp — username: admin password: hunter2 host: localhost port: 6002 dbName: myapp — username: admin password: hunter2 host: localhost port: 6003 dbName: myapp
La konfigura skemo de Pkl ankaŭ povas esti konvertita al klasoj aŭ strukturoj por enkorpigo en aplikaĵan kodon. Ekzemple, vi povas generi ligadon por Kotlin: 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 } }
fonto: opennet.ru
