Apple parantos ngadamel basa pamrograman Pkl sacara open-source, anu dirancang pikeun ngahartikeun konfigurasi sareng ngamajukeun modél "konfigurasi salaku kode". Toolchain anu aya hubunganana sareng Pkl ditulis dina Kotlin sareng diterbitkeun dina Lisénsi Apache. Plugin pikeun damel sareng kode Pkl parantos dikembangkeun pikeun lingkungan pamekaran IntelliJ, Visual Studio Code, sareng Neovim. Pangendali Language Server Protocol (LSP) diperkirakeun bakal dirilis teu lami deui.
Pkl ngagabungkeun sipat-sipat basa deklaratif anu gampang kahartos sareng kamampuan canggih basa tujuan umum. Basa ieu ngadukung anotasi tipe, kelas, fungsi, éksprési komputasi, kaayaan, sareng puteran. Pkl tiasa dianggo pikeun ngahasilkeun konfigurasi statis dina rupa-rupa format, sapertos JSON, YAML, sareng XML, sareng pikeun nyiptakeun modul pikeun ngolah format konfigurasi anu ditangtukeun dina aplikasi anu ditulis dina rupa-rupa basa pamrograman.
Binding pikeun ngahijikeun Pkl kana aplikasi sayogi pikeun Java, Kotlin, Go, sareng Swift. Modul anu misah pikeun integrasi sareng kerangka Spring sayogi. Binding ieu ngamungkinkeun anjeun pikeun nyiptakeun pakét sareng modul anu tos siap pakai kalayan kelas dumasar kana konfigurasi Pkl pikeun damel sareng konfigurasi anu dijelaskeun dina aplikasi. Pakét kalayan pedaran konfigurasi tiasa dipedalkeun dina repositori sareng diimpor salaku dependensi, anu ngamungkinkeun kode Pkl dibagikeun di sakumna proyék.
Basa ieu nyayogikeun sarana anu fléksibel pikeun nangtukeun kaayaan sareng cék validasi nilai, anu ngamungkinkeun anjeun pikeun ngadeteksi kasalahan dina konfigurasi ahir sateuacan diterapkeun kana aplikasi. Salaku conto, anjeun tiasa nangtukeun rentang nilai anu tiasa ditampi ("port: Int(this > 1000)" atanapi "age: Int(isBetween(0, 130))"), naha widang diperyogikeun atanapi opsional, sareng formatna ("zipCode: String(matches(Regex("\\d{5}")))"). Upami aya nilai anu ditugaskeun anu henteu nyumponan kaayaan, validator bakal ngaluarkeun kasalahan (contona, nalika nyobian nangtukeun nilai 1001 kana parameter anu ditetepkeun salaku "Int(this > 1000)").
Contona, dina basa Pkl, anjeun tiasa nyerat modul Application.pkl nganggo citakan pikeun ngonpigurasikeun sambungan ka DBMS: 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"
Salajengna, anjeun tiasa langsung ngadamel file konfigurasi anu nganggo modul ieu pikeun mariksa kaleresan nilaina: amends "Application.pkl" hostname = "localhost" port = 3599 environment = "dev" database { host = "localhost" port = 5786 username = "admin" password = read("env:DATABASE_PASSWORD") dbName = "myapp" }
Sareng ogé tulis generator pikeun ngotomatisasi ngarobih nomer port pikeun opat DBMS anu béda: 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 } } }
Upami dipikahoyong, anjeun tiasa ngékspor konfigurasi dina format anu sanés, contona, YAML: sidecars: - nami pangguna: admin sandi: hunter2 host: localhost port: 6000 dbName: myapp - nami pangguna: admin sandi: hunter2 host: localhost port: 6001 dbName: myapp - nami pangguna: admin sandi: hunter2 host: localhost port: 6002 dbName: myapp - nami pangguna: admin sandi: hunter2 host: localhost port: 6003 dbName: myapp
Skéma konfigurasi Pkl ogé tiasa dirobih janten kelas atanapi struct pikeun disematkeun dina kode aplikasi. Salaku conto, anjeun tiasa ngahasilkeun binding pikeun 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 } }
sumber: opennet.ru
