يأتي Elide مع Kotlin 2.5.0-Beta1. يُبلغ التوزيع المخصّص لبيئة التشغيل فقط أن kotlinc يحتاج إلى التوزيع الكامل.
تصريف الملفات المصدرية
// Hello.kt
fun main() = println("Hello!")elide kotlinc -- -d out Hello.kt
elide java -- -cp out HelloKtتأتي خيارات kotlinc بعد --، وخيارات Elide قبلها. يسرد elide kotlinc --help خيارات Elide، ويسرد
elide kotlinc -- -help خيارات kotlinc.
لا يضيف elide java مكتبة Kotlin القياسية، لذا تفشل هناك الشيفرة التي تستدعيها (listOf و joinToString):
fun main() = println(listOf("Hello", "Kotlin").joinToString(" "))| الأمر | النتيجة |
|---|---|
elide kotlinc -- -d out Hello. ثم elide java -- -cp out HelloKt | NoClassDefFoundError: kotlin/ |
elide kotlinc -- -include-runtime -d hello. | يفشل التصريف |
elide run Hello.kt | Hello Kotlin |
elide build مع مُخرَج Jvm.JvmApplication | سكربت تشغيل مع المكتبة القياسية في lib/ |
خيارات Elide
| الخيار | الغرض |
|---|---|
--incremental | الاحتفاظ بالحالة التزايدية في .، مفهرسة حسب مسار الناتج. |
--incremental-cache-dir DIR | تخزين الحالة التزايدية في DIR. |
--plugins LIST | تفعيل هذه الإضافات المدمجة تحديدًا: metro و serialization و atomicfu و power-assert. |
--metro، --no-metro | فرض تشغيل إضافة حقن التبعيات Metro أو إيقافها. |
--tests | تفعيل إضافات الاختبار (power-assert). |
--max-errors N | عدد الأخطاء المعروضة؛ 0 يعرضها كلها. تُزال التحذيرات المكررة ولا يُحدّ عددها أبدًا. |
--report-used-deps PATH | كتابة إدخالات classpath التي يشير إليها الناتج (التبعيات الصارمة في Bazel). |
--persistent_worker | العمل كعامل دائم في Bazel (persistent worker)، بنمط singleplex أو multiplex. |
--abi-only | تجريبي: كتابة ملف JAR للواجهة الثنائية فقط في -d. |
ملفات JAR للواجهة الثنائية
elide kotlinc --abi-only -- -d header.jar src/**/*.ktيحتوي ملف JAR على التواقيع العامة والمحمية، و @Metadata، وأجسام inline المؤثرة في الواجهة الثنائية، وقيم
const، وعلامات الوسائط الافتراضية. تعطي الواجهة الثنائية التي لم تتغير ملف JAR مطابقًا بايتًا ببايت، فتبقى
الوحدات المعتمدة عليه في الذاكرة المؤقتة عند تعديل الأجسام.
يتخطى ELIDE_KOTLINC_ABI_STRIP=1 توليد شيفرة الأجسام. اتركه دون ضبط عندما تتضمن الواجهة الثنائية تصريحات
تولّدها الإضافات، مثل $serializer في kotlinx.serialization. يقبله العمّال لكل طلب على حدة.
بناء المشاريع
يُصرّف elide build مجموعات مصادر Kotlin التي يعثر عليها وفق الاصطلاح أو المُعلنة في elide.pkl.
kotlin {
apiLevel = "auto"
languageLevel = "auto"
compilerOptions {
allWarningsAsErrors = true
optIn { "kotlin.time.ExperimentalTime" }
freeCompilerArgs { "-Xcontext-parameters" }
}
}| الخاصية | المعنى | القيمة الافتراضية |
|---|---|---|
kotlin.apiLevel، kotlin.languageLevel | "1.9" … "2.5"، أو "latest" أو "stable". | "auto" |
compilerOptions.optIn | علامات تُمرَّر عبر -opt-in. | لا شيء |
compilerOptions.، .extraWarnings، .allWarningsAsErrors، .suppressWarnings، .verbose | مفاتيح kotlinc المقابلة. | false |
compilerOptions. | وسائط إضافية للمُصرّف. | لا شيء |
compilerOptions.، .languageVersion، .jvmTarget | إصدارات لكل عملية تصريف؛ و "auto" يتبع المشروع. | "auto" |
compilerOptions. | إصدار بيانات وصفية للمعاملات من أجل الانعكاس في Java. | false |
compilerOptions. | "ERROR" أو "WARNING" أو "IGNORE" عند عدم تطابق هدفي Kotlin و Java. | "ERROR" |
compilerOptions.، .noJdk | إسقاط المكتبة القياسية أو JDK من classpath. | false |
compilerOptions. | غير مدعوم: القيمة true تُفشل تصريف Kotlin. حزّم باستخدام مُخرَج Jvm.JvmApplication. | false |
compilerOptions. | البناء التزايدي للمشروع. | true |
تكتب كل عملية تصريف وسائطها في kotlinc.args بجوار ناتجها.
الإضافات والميزات
kotlin.features | التأثير | القيمة الافتراضية |
|---|---|---|
kotlinx | مكتبات KotlinX على جذور تبعيات Kotlin. | true |
defaultPlugins | حزمة الإضافات المدمجة. | true |
serialization | إضافة kotlinx.serialization ومكتبة تشغيلها. | kotlinx && defaultPlugins |
coroutines | مكتبة تشغيل kotlinx.coroutines. | kotlinx |
atomicfu | إضافة kotlinx.atomicfu ومكتبة تشغيلها. | kotlinx && defaultPlugins |
powerAssert | إضافة Power Assert. | defaultPlugins |
metro | إضافة حقن التبعيات Metro. | defaultPlugins |
reflection | kotlin-reflect ضمنيًا. | true |
testing | مكتبات اختبار Kotlin على مجموعات الاختبار. | true |
kotlin {
features {
metro = false
}
plugins {
["org.jetbrains.kotlinx.serialization"] {
["mode"] = "json"
}
}
}
dependencies {
maven {
kotlinPlugins { "com.example:my-compiler-plugin:1.0.0" }
}
}- يصبح كل إدخال في
pluginsعلى الصورة-P plugin:<id>:<key>=<value>، مرتّبًا حسب المعرّف ثم المفتاح. - توضع إضافات الجهات الخارجية في الفئة
kotlinPluginsوتحتاج إلىManagedKotlinToolchainأوCustomKotlinToolchain. يُصدر المُصرّف المدمج التحذيرCustom Kotlin compiler plugins are not supported when using the embedded compiler, plugins will not be appliedويُصرّف من دونها. - تُتخطى الإضافة المدمجة غير الموجودة في التوزيع مع خياراتها، ويصدر تحذير.
- لا تُضاف مكتبات Kotlin الضمنية إلا إلى جذور التبعيات التي تحتوي على مصادر Kotlin. يُسقط
reflection = falseمكتبةkotlin-reflect، ويُسقطcompilerOptions.noStdlib = trueهذه المكتبة والمكتبة القياسية معًا. تبقى التبعيات المُعلنة. - يكشف
project("core").friend()تصريحاتinternalالخاصة بمشروع شقيق؛ راجع مساحات العمل. - ترى مجموعة المصادر تصريحات
internalفي المجموعات التي تعتمد عليها داخل المشروع نفسه: كل مجموعة مذكورة فيdependsOnالخاص بها (وmainلمجموعة اختبار لا تذكره)، إضافة إلى المجموعات التي تعتمد عليها تلك.
اختيار سلسلة الأدوات
import "elide:Kotlin.pkl" as Kotlin
kotlin {
toolchain = "embedded" // the default
// toolchain = new Kotlin.ManagedKotlinToolchain { version = "2.4.0" }
// toolchain = new Kotlin.CustomKotlinToolchain { path = "/opt/kotlinc" }
}| سلسلة الأدوات | السلوك |
|---|---|
"embedded" | Kotlin المضمّن في Elide. |
ManagedKotlinToolchain | تنزّل ذلك الإصدار (بما في ذلك الإصدارات التمهيدية) مع مكتبته القياسية و reflect ومكتبات الاختبار وإضافات Kotlin. لا تتغير إصدارات KotlinX و Metro وغيرهما من مكونات الجهات الخارجية؛ تحقّق من توافقها. |
CustomKotlinToolchain | توزيع Kotlin محلي؛ وتُتخطى الإضافات المدمجة التي يفتقر إليها. |
تنطبق سلسلة الأدوات على بناء المشاريع؛ أما elide kotlinc فيستخدم دائمًا المُصرّف المضمّن.
لا يدعم Elide أداتي KAPT و KSP. يجب أن تحصل شيفرة Kotlin التي تستخدم أنواع Java مُولَّدة عليها من مجموعة مصادر أو مشروع سابق في سلسلة البناء.
أمثلة
ابدأ من قالب:
elide init --template ktjvm # Kotlin app with a test