Zum Inhalt springen

Kotlin-Compiler

Kompilieren Sie Kotlin 2.5 mit elide kotlinc oder im Build eines Elide-Projekts, mit integrierten Compiler-Plugins wie Serialization und Metro, sowie ABI-JARs.

Auf dieser Seite

Elide enthält Kotlin 2.5.0-Beta1. Eine reine Laufzeit-Distribution meldet, dass kotlinc die vollständige Distribution benötigt.

Quelldateien kompilieren

// Hello.kt
fun main() = println("Hello!")
elide kotlinc -- -d out Hello.kt
elide java -- -cp out HelloKt
0:12 / 0:12

kotlinc-Optionen folgen nach --, Elide-Optionen stehen davor. elide kotlinc --help listet die von Elide auf, elide kotlinc -- -help die von kotlinc.

elide java fügt die Kotlin-Standardbibliothek nicht hinzu, daher schlägt Code, der sie aufruft (listOf, joinToString), dort fehl:

fun main() = println(listOf("Hello", "Kotlin").joinToString(" "))
BefehlErgebnis
elide kotlinc -- -d out Hello.kt, dann elide java -- -cp out HelloKtNoClassDefFoundError: kotlin/collections/CollectionsKt
elide kotlinc -- -include-runtime -d hello.jar Hello.ktKompilierung schlägt fehl
elide run Hello.ktHello Kotlin
elide build mit einem Jvm.JvmApplication-ArtefaktStartskript mit der Standardbibliothek in lib/

Elide-Optionen

OptionZweck
--incrementalInkrementellen Zustand in .dev/artifacts/kotlinc/incremental/ halten, nach Ausgabepfad geschlüsselt.
--incremental-cache-dir DIRInkrementellen Zustand in DIR speichern.
--plugins LISTGenau diese integrierten Plugins aktivieren: metro, serialization, atomicfu, power-assert.
--metro, --no-metroDas Metro-DI-Plugin erzwingen oder abschalten.
--testsDie Test-Plugins aktivieren (power-assert).
--max-errors NAngezeigte Fehler; 0 zeigt alle. Warnungen werden dedupliziert und nie begrenzt.
--report-used-deps PATHDie Classpath-Einträge schreiben, auf die die Ausgabe verweist (Bazel Strict Deps).
--persistent_workerAls persistenter Bazel-Worker laufen, Singleplex oder Multiplex.
--abi-onlyExperimentell: nur ein ABI-JAR nach -d schreiben.

ABI-JARs

elide kotlinc --abi-only -- -d header.jar src/**/*.kt

Das JAR enthält öffentliche und geschützte Signaturen, @Metadata, ABI-relevante inline-Rümpfe, const-Werte und Markierungen für Standardargumente. Eine unveränderte ABI ergibt ein byteidentisches JAR, sodass Änderungen an Rümpfen abhängige Module im Cache belassen.

ELIDE_KOTLINC_ABI_STRIP=1 überspringt die Codegenerierung für Rümpfe. Lassen Sie die Variable ungesetzt, wenn die ABI von Plugins generierte Deklarationen enthält, etwa $serializer von kotlinx.serialization. Worker akzeptieren sie pro Anfrage.

Projekte bauen

elide build kompiliert Kotlin-Source-Sets, die per Konvention gefunden oder in elide.pkl deklariert werden.

kotlin {
  apiLevel = "auto"
  languageLevel = "auto"
  compilerOptions {
    allWarningsAsErrors = true
    optIn { "kotlin.time.ExperimentalTime" }
    freeCompilerArgs { "-Xcontext-parameters" }
  }
}
EigenschaftBedeutungStandard
kotlin.apiLevel, kotlin.languageLevel"1.9" … "2.5", "latest" oder "stable"."auto"
compilerOptions.optInMarker, die als -opt-in übergeben werden.keine
compilerOptions.progressiveMode, .extraWarnings, .allWarningsAsErrors, .suppressWarnings, .verboseDie entsprechenden kotlinc-Schalter.false
compilerOptions.freeCompilerArgsZusätzliche Compiler-Argumente.keine
compilerOptions.apiVersion, .languageVersion, .jvmTargetVersionen pro Kompilierung; "auto" folgt dem Projekt."auto"
compilerOptions.javaParametersParameter-Metadaten für Java-Reflection erzeugen.false
compilerOptions.jvmTargetValidationMode"ERROR", "WARNING" oder "IGNORE" bei abweichendem Kotlin- und Java-Ziel."ERROR"
compilerOptions.noStdlib, .noJdkStandardbibliothek oder JDK aus dem Classpath entfernen.false
compilerOptions.includeRuntimeNicht unterstützt: true lässt die Kotlin-Kompilierung fehlschlagen. Paketieren Sie mit einem Jvm.JvmApplication-Artefakt.false
compilerOptions.incrementalInkrementelle Projekt-Builds.true

Jede Kompilierung schreibt ihre Argumente in kotlinc.args neben ihrer Ausgabe.

Plugins und Features

kotlin.featuresWirkungStandard
kotlinxKotlinX-Bibliotheken in Kotlin-Abhängigkeitswurzeln.true
defaultPluginsIntegrierte Plugin-Suite.true
serializationPlugin und Laufzeitbibliothek von kotlinx.serialization.kotlinx && defaultPlugins
coroutinesLaufzeitbibliothek von kotlinx.coroutines.kotlinx
atomicfuPlugin und Laufzeitbibliothek von kotlinx.atomicfu.kotlinx && defaultPlugins
powerAssertPower-Assert-Plugin.defaultPlugins
metroMetro-DI-Plugin.defaultPlugins
reflectionImplizites kotlin-reflect.true
testingKotlin-Testbibliotheken in Test-Sets.true
kotlin {
  features {
    metro = false
  }
  plugins {
    ["org.jetbrains.kotlinx.serialization"] {
      ["mode"] = "json"
    }
  }
}

dependencies {
  maven {
    kotlinPlugins { "com.example:my-compiler-plugin:1.0.0" }
  }
}
  • Jeder Eintrag in plugins wird zu -P plugin:<id>:<key>=<value>, sortiert nach ID und Schlüssel.
  • Plugins von Drittanbietern kommen in den Bucket kotlinPlugins und benötigen eine ManagedKotlinToolchain oder CustomKotlinToolchain. Der eingebettete Compiler warnt mit Custom Kotlin compiler plugins are not supported when using the embedded compiler, plugins will not be applied und kompiliert ohne sie.
  • Ein integriertes Plugin, das in der Distribution fehlt, wird samt seinen Optionen übersprungen, mit einer Warnung.
  • Implizite Kotlin-Bibliotheken gehen nur an Abhängigkeitswurzeln mit Kotlin-Quellen. reflection = false entfernt kotlin-reflect; compilerOptions.noStdlib = true entfernt es und die Standardbibliothek. Deklarierte Abhängigkeiten bleiben erhalten.
  • project("core").friend() macht die internal-Deklarationen eines Geschwisterprojekts sichtbar; siehe Workspaces.
  • Ein Source-Set sieht die internal-Deklarationen der Sets, von denen es im selben Projekt abhängt: jedes in seinem dependsOn genannte Set (main für ein Test-Set, das es weglässt) sowie die Sets, von denen diese abhängen.

Werkzeugkette wählen

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" }
}
WerkzeugketteVerhalten
"embedded"Das mit Elide gebündelte Kotlin.
ManagedKotlinToolchainLädt diese Version (auch Vorabversionen) mit ihrer Standardbibliothek, reflect, Testbibliotheken und Kotlin-Plugins herunter. Versionen von KotlinX, Metro und anderen Drittanbietern bleiben unverändert; prüfen Sie, ob sie passen.
CustomKotlinToolchainEine lokale Kotlin-Distribution; integrierte Plugins, die ihr fehlen, werden übersprungen.

Die Werkzeugkette gilt für Projekt-Builds; elide kotlinc verwendet immer den gebündelten Compiler.

KAPT und KSP werden nicht unterstützt. Kotlin-Code, der generierte Java-Typen verwendet, muss sie aus einem vorgelagerten Source-Set oder Projekt beziehen.

Beispiele

Beginnen Sie mit einer Vorlage:

elide init --template ktjvm       # Kotlin app with a test

War diese Seite hilfreich?