اپل یک پیاده سازی از زبان پیکربندی Pkl را به صورت متن باز ارائه کرده است که مدل پیکربندی به عنوان کد را ارتقا می دهد. جعبه ابزار مرتبط با Pkl به زبان Kotlin نوشته شده و تحت مجوز آپاچی منتشر شده است. پلاگین هایی برای کار با کد به زبان Pkl برای محیط های توسعه IntelliJ، Visual Studio Code و Neovim آماده شده است. انتشار LSP (پروتکل سرور زبان) در آینده نزدیک انتظار می رود.
Pkl خصوصیات یک زبان اعلانی قابل فهم را با ویژگی های پیشرفته زبان های همه منظوره ترکیب می کند. این زبان از حاشیه نویسی نوع، کلاس ها، توابع، عبارات محاسباتی، شرایط و حلقه ها پشتیبانی می کند. Pkl را می توان هم برای تولید پیکربندی های ثابت در قالب های مختلف مانند JSON، YAML و XML و هم برای تولید ماژول هایی برای پردازش فرمت های پیکربندی مشخص در برنامه های کاربردی در زبان های برنامه نویسی مختلف استفاده کرد.
اتصالات برای ادغام Pkl در برنامه ها برای جاوا، کاتلین، گو و سوئیفت آماده شده است. یک ماژول برای ادغام با چارچوب Spring به طور جداگانه پیشنهاد شده است. Bindings بر اساس پیکربندی در زبان Pkl، امکان ایجاد بستهها و ماژولهای آماده با کلاسها را برای کار با پیکربندی توصیفشده در برنامه ایجاد میکند. بسته های پیکربندی را می توان در مخازن منتشر کرد و به عنوان وابستگی وارد کرد و به کد Pkl اجازه می دهد بین پروژه های مختلف به اشتراک گذاشته شود.
این زبان ابزارهای انعطاف پذیری را برای تعریف شرایط و بررسی صحت مقادیر فراهم می کند و به شما امکان می دهد قبل از استفاده در برنامه، خطاها را در پیکربندی نهایی شناسایی کنید. به عنوان مثال، می توانید محدوده معتبر مقادیر ("port: Int(this > 1000)" یا "age: Int(isBetween(0, 130))")، اینکه آیا لازم است یا نه، و قالب را تعیین کنید. ("زیپ کد: رشته (مطابقات(Regex( "\\d{5}")))"). اگر مقداری را تخصیص دهید که شرایط را برآورده نمی کند، اعتباردهنده خطایی ایجاد می کند (به عنوان مثال، اگر سعی کنید مقدار 1001 را به پارامتری که به عنوان "Int(this > 1000)" تعریف شده است اختصاص دهید).
به عنوان مثال، در زبان Pkl می توانید ماژول Application.pkl را با یک الگوی پیکربندی برای اتصال به DBMS بنویسید: ماژول نام میزبان برنامه: پورت رشته: محیط UInt16: پایگاه داده محیطی: کلاس پایگاه داده پایگاه داده { نام کاربری: رمز عبور رشته: میزبان رشته: پورت رشته: UInt16 dbName: String } typealias Environment = "dev"|"qa"|"prod"
در مرحله بعد، می توانید مستقیماً یک فایل پیکربندی ایجاد کنید که از این ماژول برای بررسی صحت مقادیر استفاده کند: نام میزبان "Application.pkl" = پورت "localhost" = 3599 محیط = پایگاه داده "dev" { میزبان = پورت "localhost" = 5786 نام کاربری = رمز عبور "admin" = read("env:DATABASE_PASSWORD") dbName = "myapp" }
و همچنین یک ژنراتور برای تغییر خودکار شماره پورت برای چهار DBMS مختلف بنویسید: "Application.pkl" 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 } }
در صورت تمایل، می توانید پیکربندی را در قالب دیگری صادر کنید، به عنوان مثال، YAML: sidecars: - نام کاربری: رمز عبور مدیریت: hunter2 میزبان: پورت localhost: 6000 dbName: myapp - نام کاربری: رمز عبور admin: hunter2 میزبان: پورت localhost: 6001 dbName : myapp - نام کاربری: رمز عبور مدیریت: هاست hunter2: پورت لوکال هاست: 6002 dbName: myapp — نام کاربری: رمز عبور مدیریت: Hunter2 میزبان: پورت لوکال هاست: 6003 dbName: myapp
نمودار پیکربندی Pkl همچنین می تواند به کلاس ها یا ساختارهایی برای جاسازی در کد برنامه تبدیل شود. به عنوان مثال، شما می توانید یک اتصال برای Kotlin ایجاد کنید: import kotlin.Int import kotlin.Long import kotlin.String class data Application( val hostname: String, val port: Int, val محیط: Environment, val database: Database ) { data class پایگاه داده (نام کاربری val: رشته، رمز عبور val: رشته، میزبان val: رشته، پورت val: Int، val dbName: String) کلاس enum Environment( مقدار ارزش: رشته ) { DEV("dev"), QA("qa") , PROD( "prod"); override fun toString() = value } }
منبع: opennet.ru
