Apple, kod olarak yapılandırma modelini destekleyen Pkl yapılandırma dilinin açık kaynaklı bir uygulamasına sahiptir. Pkl ile ilgili araç seti Kotlin'de yazılmıştır ve Apache lisansı altında yayınlanmıştır. IntelliJ, Visual Studio Code ve Neovim geliştirme ortamları için Pkl dilinde kodlarla çalışmaya yönelik eklentiler hazırlanmıştır. LSP (Dil Sunucusu Protokolü) işleyicisinin yakın gelecekte yayınlanması bekleniyor.
Pkl, anlaşılması kolay bir bildirimsel dilin özelliklerini genel amaçlı dillerin gelişmiş özellikleriyle birleştirir. Dil, tür açıklamalarını, sınıfları, işlevleri, hesaplamalı ifadeleri, koşulları ve döngüleri destekler. Pkl, hem JSON, YAML ve XML gibi çeşitli formatlarda statik konfigürasyonlar oluşturmak hem de çeşitli programlama dillerindeki uygulamalarda belirtilen konfigürasyon formatlarını işlemek için modüller oluşturmak için kullanılabilir.
Java, Kotlin, Go ve Swift için Pkl'nin uygulamalara entegrasyonuna yönelik bağlamalar hazırlanmıştır. Spring çerçevesiyle entegrasyon için bir modül ayrı olarak önerilmektedir. Bağlamalar, Pkl dilindeki konfigürasyona dayanarak, uygulamada açıklanan konfigürasyonla çalışmak için hazır paketler ve sınıflara sahip modüller oluşturmaya olanak tanır. Yapılandırma paketleri depolarda yayınlanabilir ve bağımlılıklar olarak içe aktarılabilir, böylece Pkl kodunun farklı projeler arasında paylaşılmasına olanak sağlanır.
Dil, koşulları tanımlamak ve değerlerin doğruluğunu kontrol etmek için esnek araçlar sağlayarak, uygulamada kullanılmadan önce son yapılandırmadaki hataları tanımlamanıza olanak tanır. Örneğin, gerekli olsun veya olmasın geçerli değer aralığını (“port: Int(this > 1000)” veya “age: Int(isBetween(0, 130))”) ve formatı tanımlayabilirsiniz. (“zipCode: String(matches(Regex( "\\d{5}")))"). Koşulu karşılamayan bir değer atarsanız doğrulayıcı bir hata atar (örneğin, "Int(this > 1001)" olarak tanımlanan bir parametreye 1000 değerini atamaya çalışırsanız).
Örneğin, Pkl dilinde, bir DBMS'ye bağlanmak için Application.pkl modülünü bir yapılandırma şablonuyla yazabilirsiniz: module Uygulama ana bilgisayar adı: String port: UInt16 ortam: Ortam veritabanı: Veritabanı sınıfı Veritabanı { kullanıcı adı: String şifre: String host: Dize bağlantı noktası: UInt16 dbName: String } typealias Environment = "dev"|"qa"|"prod"
Daha sonra, değerlerin doğruluğunu kontrol etmek için bu modülü kullanan bir yapılandırma dosyasını doğrudan oluşturabilirsiniz: "Application.pkl"yi değiştirir ana bilgisayar adı = "localhost" bağlantı noktası = 3599 ortam = "dev" veritabanı { ana bilgisayar = "localhost" bağlantı noktası = 5786 kullanıcı adı = “yönetici” şifre = read("env:DATABASE_PASSWORD") dbName = "uygulamam" }
Ayrıca dört farklı DBMS için port numarasını değiştirmeyi otomatikleştirmek için bir oluşturucu yazın: import “Application.pkl” gizli db: Application.Database = new { host = “localhost” kullanıcı adı = “admin” şifre = read(“env:DATABASE_PASSWORD” ) dbName = "uygulamam" } sepetler { for (Listedeki ofset(0, 1, 2, 3)) { (db) { port = 6000 + ofset } } }
İstenirse, konfigürasyonu farklı bir formatta dışa aktarabilirsiniz, örneğin, YAML: sepetler: - kullanıcı adı: yönetici şifresi: hunter2 ana bilgisayar: localhost bağlantı noktası: 6000 dbName: uygulamam - kullanıcı adı: yönetici şifresi: hunter2 ana bilgisayar: localhost bağlantı noktası: 6001 dbName : uygulamam - kullanıcı adı: yönetici şifresi: hunter2 ana bilgisayar: localhost bağlantı noktası: 6002 dbName: uygulamam — kullanıcı adı: yönetici şifresi: hunter2 ana bilgisayar: localhost bağlantı noktası: 6003 dbName: uygulamam
Pkl konfigürasyon diyagramı aynı zamanda uygulama koduna gömülmek üzere sınıflara veya yapılara dönüştürülebilir. Örneğin, Kotlin için bir bağlama oluşturabilirsiniz: import kotlin.Int import kotlin.Long import kotlin.String data class Application( val hostname: String, val port: Int, val ambient: Environment, val veritabanı: Database ) { data class Database( val kullanıcı adı: String, val şifre: String, val host: String, val port: Int, val dbName: String ) enum class Environment( val value: String ) { DEV("dev"), QA("qa") , PROD("ürün"); fun toString()'i geçersiz kıl = değer } }
Kaynak: opennet.ru
